• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

请教关于表中日期截取并减去现有日期的问题

sonywinb1 2008-04-07 01:48:44
select (convert(int,substring(sxrq,1,4))-YEAR(getdate()))*
365+(convert(int,substring(sxrq,6,2))-MONTH(getdate()))*30 as '近效期天数'
from ywmxk
服务器: 消息 245,级别 16,状态 1,行 1
将 varchar 值 '200-' 转换为数据类型为 int 的列时发生语法错误。

在ywmxk表中sxrq字段里存放货品过期的日期格式为2008-05-01,现要将这个日期与当前机器日期相减
得到近效期天数,但出现上面的错误,请教一下,谢谢!
...全文
115 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wangxuelid 2008-04-07

DATEADD
在向指定日期加上一段时间的基础上,返回新的 datetime 值。

语法
DATEADD ( datepart , number, date )

参数
datepart

是规定应向日期的哪一部分返回新值的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 缩写
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms


number

是用来增加 datepart 的值。如果指定一个不是整数的值,则将废弃此值的小数部分。例如,如果为 datepart 指定 day,为 number 指定 1.75,则 date 将增加 1。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。有关指定日期的更多信息,请参见 datetime 和 smalldatetime。

如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

返回类型
返回 datetime,但如果 date 参数是 smalldatetime,返回 smalldatetime。

示例
此示例打印出 pubs 数据库中标题的时间结构的列表。此时间结构表示当前发布日期加上 21 天。

USE pubs
GO
SELECT DATEADD(day, 21, pubdate) AS timeframe
FROM titles
GO

下面是结果集:

timeframe
---------------------------
Jul 3 1991 12:00AM
Jun 30 1991 12:00AM
Jul 21 1991 12:00AM
Jul 13 1991 12:00AM
Jun 30 1991 12:00AM
Jul 9 1991 12:00AM
Mar 14 1997 5:09PM
Jul 21 1991 12:00AM
Jul 3 1994 12:00AM
Mar 14 1997 5:09PM
Nov 11 1991 12:00AM
Jul 6 1991 12:00AM
Oct 26 1991 12:00AM
Jul 3 1991 12:00AM
Jul 3 1991 12:00AM
Nov 11 1991 12:00AM
Jul 3 1991 12:00AM
Jul 3 1991 12:00AM

(18 row(s) affected)


回复
viva369 2008-04-07

select (convert(int,substring(sxrq,1,4))-YEAR(getdate()))* 365+
(convert(int,substring(sxrq,6,2))-MONTH(getdate()))*30 as '近效期天数'
from ywmxk

==》

select (convert(int,substring(convert(char(10),sxrq,120),1,4))-YEAR(getdate()))* 365+
(convert(int,substring(convert(char(10),sxrq,120),6,2))-MONTH(getdate()))*30 as '近效期天数'
from ywmxk
回复
wangxuelid 2008-04-07

DATEDIFF
返回跨两个指定日期的日期和时间边界数。

语法
DATEDIFF ( datepart , startdate , enddate )

参数
datepart

是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 缩写
year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms


startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。

enddate

是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型
integer

注释
startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。

当结果超出整数值范围,DATEDIFF 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

计算跨分钟、秒和毫秒这些边界的方法,使得 DATEDIFF 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值,其等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

示例
此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。

USE pubs
GO
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles
GO


请参见

回复
pt1314917 2008-04-07

SELECT datediff(dd,getdate(),cast(rtrim(sxrq) as datetime)) as '近效期天数'
from ywmxk
回复
sonywinb1 2008-04-07
sxrq是char型的
回复
sonywinb1 2008-04-07
这两个运行不出来,从字符串转换为 datetime 时发生语法错误。
回复
viva369 2008-04-07
DATEDIFF
可以返回2个时间内差值~
回复
ojuju10 2008-04-07

select datediff(day,getdate(),sxrq) from ywmxk
回复
loworth 2008-04-07

[CODE=SQL]

SELECT DATEDIFF(DAY,GETDATE(),sxrq) FROM ywmxk[/CODE]
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-07 01:48
社区公告
暂无公告