2017-12-11 66 views
0

わずかな問題がありました。私は数十万行のビューを持っており、指数関数的に大きくなります。2017-07-10 12:13:46.000のような日時の列です。SQL ServerのDATEDIFFは、日比較でオーバーフローを起こします。

私は過去7日間にタイムスタンプのあるアイテムのみを選択しようとしています。 DATEDIFFは、タイムスタンプの整数を作成した場合でも、それはshouldnとして、私は、なぜこれが本当にわからないんだけど

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

SELECT Top(100) * FROM vw_dataList 
WHERE DATEDIFF(DAY, vw_dataList.startTime, CURRENT_TIMESTAMP) < 7; 

しかし、これはエラーになり:私はこれを持っていますオーバーフローを引き起こすような大きな整数でなければならないのでしょうか?どこから行くのか分からないので、アドバイスをいただければ幸いです!

乾杯!

+0

今日のみまたは昨日のみを選択した場合の出力は何ですか? – Tomm

+0

数字が何であっても同じです – Compy

+0

番号がない場合でも、その日はcurrent_timestampですか? – Tomm

答えて

0

は、あなたが使用している場合、このクエリのプランが良くなるようだ:

WHERE w_dataList.startTime > GETDATE() - 7 

あなたは、テーブルのサイズが大きすぎるとコメントとして、あなたもおそらく勝ったこの列にインデックスを挿入することができますDATEDIFF()関数で使用することはできません。

インデックスサンプル:

CREATE INDEX ix_dataList ON vw_dataList (startTime DESC); 

PS:それはビューのようですので、あなたのテーブルに挿入するためのビューを交換する必要があります。

PS2:実際にこのインデックスが必要かどうか確認してください。実行計画で確認できます。

+0

@Compy、うれしい解決策を見つけました。もし私があなたなら私はまだ最初にエラーの原因を見つけることを試みるでしょう。マーティン・スミスが観察したように、あなたはこのエラーをまったく受けるべきではありません。 – HoneyBadger

1

DATEDIFF関数がオーバーフローする原因となっている過去または将来のかなりの日付がテーブルにあるようです。この関数は符号付き整数を返します。したがって、将来のまたは過去の20億の日がオーバーフローします。

1つのオプションは、すべてのDATEDIFFを使用して、代わりに現在の時刻からDATEADD減算7日を使用して比較するためにそれを使用しないことです。

SELECT TOP(100) * 
FROM vw_dataList 
WHERE vw_dataList.startTime >= DATEADD(DAY, -7, CURRENT_TIMESTAMP) 

可能な代替、私はこの中で、それをrecommentないでしょうけれどもこの場合、BIGINTが返されるので、DATEDIFF_BIGを使用してください。

+0

サポートされている日付の範囲は3,652,058日です。これは20億分の1です。 –