Sql server TSQL日期溢出问题

Sql server TSQL日期溢出问题,sql-server,tsql,datetime,stored-procedures,sql-server-2012,Sql Server,Tsql,Datetime,Stored Procedures,Sql Server 2012,我正试图对团队内部出现的问题进行思考。计算稍后在计算中使用的日期之间的秒数的简单查询 我们遇到的问题/错误是:datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用 此图显示查询及其用于计算的记录。它工作的唯一原因是底部的一行明确定义了时间范围 当我删除时间并只保留最新的日期时,就会出现溢出错误 workingStart的数据类型是datetime,所以我唯一能想到的是将日期与datetime字符串进行比较会导致

我正试图对团队内部出现的问题进行思考。计算稍后在计算中使用的日期之间的秒数的简单查询

我们遇到的问题/错误是:datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用

此图显示查询及其用于计算的记录。它工作的唯一原因是底部的一行明确定义了时间范围

当我删除时间并只保留最新的日期时,就会出现溢出错误

workingStart的数据类型是datetime,所以我唯一能想到的是将日期与datetime字符串进行比较会导致溢出

错误:

有人对为什么会发生这种错误有正式的答案吗?我唯一的猜测是数据类型比较

更新: 以下是忽略sla dateDiff时对所有数据的查询。

如果您仍需要几秒钟内的结果。使用分钟,然后调整大小

 cast(DateDiff(MINUTE,[workingStart],[WorkingEnd) as bigint)*60
要以秒为单位生成溢出,您需要大于68年、1个月、19天、3小时、14分钟和7秒的日期差

Select DateAdd(SS,2147483647 ,'1900-01-01')   -- 1968-01-20 03:14:07.000
Select DateAdd(SS,2147483648 ,'1900-01-01')   -- Overfow with just 1 more second
我怀疑有一个虚假的日期开始或结束

防止错误


如果删除将出现错误的位置

,是否确定workingend对每条记录都有一个值?也许你有一个值为0的,当你只过滤日期时会显示出来。@MarcB在不包括workingEnddatediff计算的情况下添加了另一个数据截图,它的结果返回一个有符号的32位整数,这意味着秒的总允许范围为68年。您应该运行一个单独的查询,看看是否有任何记录的日期之间的差异大于等于34年,而不使用datediff.Yah,在其中的某个地方,它看起来很可能是一个不可靠的日期。所有它需要的是有人键入2106而不是2016。与基于日期的差异进行检查,以查找较大的差异,或者只需查看日期差异的最小值和最大值,看看是否有任何可疑之处。那么datediff是否会查看所有记录,而不考虑where子句,并对可能不在我最终结果集中的数据进行计算?谢谢,虽然我对答案持开放态度,但我真的只想知道这个问题的根本原因。谢谢,John-你能确认dateDiff发生在我的WHERE子句过滤我的数据集之前吗?有点困惑,为什么它使用的数据不是我的WHERE子句range中定义的。如果按CTRL-L,您将看到查询计划,并且您将看到计算发生在过滤器之前。SQLServer提供了一个最快的查询计划。这可能意味着也可能不意味着某些步骤比其他步骤先发生。随着索引的创建/删除、表大小的增长和统计信息的更改,计划可能随时更改
Declare @YourTable table (StartDate Datetime,EndDate DateTime)
Insert Into @YourTable values
('2016-08-01 10:36:16','2016-09-01 11:15:16'),
('1900-01-01 00:00:00','1968-01-20 04:14:07.000')  -- will cause an error


Select *
       ,Seconds=DateDiff(SS,StartDate,EndDate)
 From  @YourTable
 Where Abs(DateDiff(YY,StartDate,EndDate))<68