在运行以下查询时
select DATEDIFF(SECOND, 0, DATEADD(SECOND, -1, '2014-04-11 23:52'))
无论我提供给它的日期如何,我都会收到以下错误消息。
datediff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用具有不太精确的日期部分的datediff。
答案 0 :(得分:2)
Datediff接受以下参数:interval,starting_date,ending_date,因此您的SELECT尝试查找start_date的服务器默认值与您的日期之间的秒数差异。 当您将0指定为starting_date时,MS SQL将其替换为'1900-01-01 00:00'。返回的秒数~3606249060,但DATEDIFF返回int,返回的秒数大于数据类型int可以处理。
如果指定minute
而不是second
,它可以正常工作,因为它将返回60104151,即int
您可以使用类似的选择来查找现在和您定义的日期之间的秒数差异:
select DATEDIFF(SECOND, GETDATE(), DATEADD(SECOND,-1,'2014-04-11 23:52'))
如果您将硬编码日期作为starting_date参数,那么您将得到-1秒的差异(由于您使用过DATEADD):
select DATEDIFF(SECOND, '2014-04-11 23:52', DATEADD(SECOND,-1,'2014-04-11 23:52'))
答案 1 :(得分:0)
根据this DateDiff不起作用,因为Interval of Seconds中2个日期之间的差异超过68年。
DateDiff中的第一个参数为0表示它是' 1900-01-01 00:00:00.000',与2014-04-11 23:52'超过68年。
答案 2 :(得分:0)
您当前的查询结果为bigint,DATEDIFF只能返回一个整数。这就是你得到溢出的原因
3597523200是1900年至2014年之间的秒数
请改为尝试:
SELECT 3597523200
+ DATEDIFF(S, '2014', DATEADD(SECOND,-1,'2014-04-11 23:52'))
这与:
相同SELECT CAST(DATEDIFF(S, '1900', '1950') AS BIGINT)
+ DATEDIFF(S, '1950', '2014')
+ DATEDIFF(S, '2014', DATEADD(SECOND,-1,'2014-04-11 23:52'))