1

クエリは、機能するクエリでも結果を返さず、次のエラーが発生します。

datediff 関数でオーバーフローが発生しました。2 つの日付/時刻インスタンスを区切る日付部分の数が多すぎます。精度の低い datepart で 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が大きすぎます。

DateDiffそのため、 is2^31またはによって返される最大数のように見えます2147483647

次のようにクエリの日付範囲を制限することで、エラーを回避できます。

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