TSQL日期溢出问题

时间:2016-10-24 21:39:41

标签: sql-server tsql datetime stored-procedures sql-server-2012

我试图围绕我内部团队提出的问题。简单查询,用于计算稍后在计算中使用的日期之间的秒数。

我们遇到的问题是:" datediff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用具有不太精确的日期部分的datediff。"

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

当我删除时间并将其保留到日期时,我们会收到溢出错误。

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

enter image description here

错误:

enter image description here

任何人都有正式答案说明为什么会出现此错误?我唯一的猜测是dataType比较。

更新 忽略sla dateDiff时,这是对所有数据的查询。 enter image description here

1 个答案:

答案 0 :(得分:1)

如果您仍然需要以秒为单位的结果。使用MINUTES然后调整大小。

 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

我怀疑有一个虚假的日期(开始或结束)

防止错误

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

如果删除WHERE,您将看到错误