查询没有结果时,SQL Server Datediff返回溢出错误

时间:2012-07-03 08:49:37

标签: sql sql-server tsql datediff

查询返回的结果甚至没有结果,但是我收到了以下错误。

  

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

但没有什么可以溢出

以下工作:

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())

1 个答案:

答案 0 :(得分:0)

我写了一个循环来检查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'