1

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

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

1 回答 1

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-01自和是第一个以来的秒数2037-01-20太大。

所以看起来DateDiffis2^31或返回的最大数2147483647

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

WHERE  sd.CalendarDate >= DATEADD(day,-1,dbo.DateToday())
       and sd.CalendarDate < '2037-01-20'
于 2012-07-03T08:55:52.937 回答