【问题标题】:TSQL Date Overflow IssueTSQL 日期溢出问题
【发布时间】:2017-03-06 19:05:42
【问题描述】:

我正在努力解决我团队内部出现的一个问题。计算日期之间的秒数的简单查询,稍后在计算中使用。

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

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

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

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

错误:

有人对为什么会发生此错误有官方答案吗?我唯一的猜测是数据类型比较。

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

【问题讨论】:

  • 您确定workingend 对每条记录都有价值吗?也许您有一个带有 0 值的值,当您进行仅日期过滤时会显示该值。
  • @MarcB 添加了另一个不包括workingEnd计算的数据截图
  • datediff 为其结果返回一个带符号的 32 位 int,这意味着秒的总允许范围为 68 年。您应该运行一个单独的查询,看看是否有任何记录在日期之间存在 >=34 年的差异,而不使用 datediff。
  • 是的,肯定看起来很可能是一个不可靠的日期——只要有人输入 2106 而不是 2016。检查基于日期的日期差异以查找大的差异,或者只查看您正在约会的日期的最小值和最大值,看看是否有任何可疑之处。
  • 那么 datediff 是否会查看所有记录而不考虑 where 子句并对可能不在我的最终结果集中的数据进行计算?

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


【解决方案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 你会看到错误

【讨论】:

  • 谢谢,虽然我愿意接受答案,但我真的只是想知道这个问题的根本原因。
  • 谢谢,John - 您能否确认 dateDiff 在我的 WHERE 子句过滤我的数据集之前发生?有点困惑为什么它使用我的WHERE 子句范围中未定义的数据
  • 如果您按 CTRL-L,您将看到查询计划,并且您会看到计算发生在过滤器之前。 SQL Server 提供了一个最快的查询计划。这可能意味着也可能不意味着某些步骤发生在其他步骤之前。随着索引的创建/删除、表大小的增长和统计数据的变化,计划可能随时发生变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多