【问题标题】:SQL Server Datediff returning overflow error when query has no results查询没有结果时 SQL Server Datediff 返回溢出错误
【发布时间】:2012-07-03 16:56:20
【问题描述】:

该查询即使在它确实有效的地方也没有返回任何结果,并且我收到以下错误。

datediff 函数导致溢出。的数量 分隔两个日期/时间实例的日期部分太大。尝试使用 datediff 具有不太精确的日期部分。

但是没有什么可以溢出的

以下作品:

SELECT cis.SaleBK   
FROM dbo.Sales cis
INNER JOIN dim.CalendarDate sd on cis.SaleDateFK = sd.CalendarDatePK
WHERE sd.CalendarDate >= DATEADD(day,-1,dbo.DateToday())

还有这个:

SELECT cis.SaleBK
       ,DATEDIFF(s,'1969-01-01',sd.CalendarDate) as SortOrder
FROM dbo.Sales cis
INNER JOIN dim.CalendarDate sd on cis.SaleDateFK = sd.CalendarDatePK
WHERE sd.CalendarDate = DATEADD(day,-1,dbo.DateToday())

但事实并非如此,我不知道为什么

SELECT cis.SaleBK
       ,DATEDIFF(s,'1969-01-01',sd.CalendarDate) as SortOrder
FROM dbo.Sales cis
INNER JOIN dim.CalendarDate sd on cis.SaleDateFK = sd.CalendarDatePK
WHERE sd.CalendarDate >= DATEADD(day,-1,dbo.DateToday())

【问题讨论】:

  • 您是否有任何CalendarDate 值超过〜24 年?如果是这样,则自 1969 年以来的秒数超过了DATEDIFF 可以返回的时间。另外,为什么dbo.DateToday()
  • 啊,这只是我数据库上的一个小函数,我们使用它而不是 getdate,返回没有时间的 getdate。在这种情况下,它没有任何实际用途,但是我出于习惯使用它。
  • 另外,是的,CalendarDate 会上升到 2050,但它的键是 Sales 表,该表只有昨天的销售额,所以它肯定不应该对任何东西做 datediff 吗?

标签: sql sql-server tsql datediff


【解决方案1】:

我写了一个循环来检查datediff何时返回错误:

; with  Dates as
        (
        select  cast('2012-01-01' as date) as dt
        union all
        select  dateadd(day, 1, dt)
        from    Dates
        )
select  dt
,       DATEDIFF(s,'1969-01-01',dt)
from    Dates
option  (maxrecursion 0)

1969-01-012037-01-20 以来的秒数过大。

所以看起来DateDiff 返回的最大数字是2^312147483647

您可以通过限制查询的日期范围来避免错误,例如:

WHERE  sd.CalendarDate >= DATEADD(day,-1,dbo.DateToday())
       and sd.CalendarDate < '2037-01-20'

【讨论】:

  • 哇,好用,但是我不明白为什么当查询没有返回结果时它会尝试执行 datediff。
  • SQL Server 可能会在应用 where 子句之前评估 select。我也遇到过除零错误,不确定何时允许这种行为。
  • 但它肯定无法评估 CalendarDate 表中未链接到 Sales 表的任何内容?由于昨天之后没有销售,所以它甚至不应该在 CalendarDate 中看到这些值?
  • 它可能会从 CalendarDate 中检索所有行,计算 datediff,然后运行 ​​where 子句,然后才将它们加入 Sales。
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多