Sql server 为什么SQL Server中的DATEDIFF在间隔设置为秒时返回错误

Sql server 为什么SQL Server中的DATEDIFF在间隔设置为秒时返回错误,sql-server,datediff,Sql Server,Datediff,在运行以下查询时 select DATEDIFF(SECOND, 0, DATEADD(SECOND, -1, '2014-04-11 23:52')) 无论我提供的日期是什么,我都会收到以下错误消息 datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用 Datediff采用以下参数:间隔、开始日期、结束日期,因此您的选择尝试查找服务器默认的开始日期和您的日期之间的差异(以秒为单位)。 将0指定为开始日期时,

在运行以下查询时

select DATEDIFF(SECOND, 0, DATEADD(SECOND, -1, '2014-04-11 23:52'))
无论我提供的日期是什么,我都会收到以下错误消息

datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用


Datediff采用以下参数:间隔、开始日期、结束日期,因此您的选择尝试查找服务器默认的开始日期和您的日期之间的差异(以秒为单位)。 将0指定为开始日期时,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'))
如果您将硬编码的日期作为起始日期参数,那么您将得到-1秒的差异(由于您使用了DATEADD):

根据DateDiff的说法,它不起作用,因为两个日期之间的时间间隔超过68年


DateDiff中的第一个参数为0,表示它是“1900-01-01 00:00:00.000”,与“2014-04-11 23:52”的差异超过68年。

您当前的查询结果为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'))

DATEDIFF的第一个参数必须是DATETIME值而不是整数值。您试图对此做什么?因为
0
被解释为1900年1月1日,从那以后已经超过310亿秒了。
SELECT CAST(DATEDIFF(S, '1900', '1950') AS BIGINT) 
   + DATEDIFF(S, '1950', '2014')
   + DATEDIFF(S, '2014', DATEADD(SECOND,-1,'2014-04-11 23:52'))