2009-09-15 25 views
50

私はMS SQL 2005を使用していますが、2つの日付が等しいかどうかをチェックしたいが、時間部分は無視したい。時間部分を無視してT-SQLの日付を比較します

私はDATEDIFFを利用することができますが、遅くなる可能性があることを心配しています - このSPはDBで多く使われています!

提案がありますか?

編集:デビッドアンドレスコメント:

『『比較』が平等よりもはるかに』を含む
は、私は十分に私の質問を明確にしなかったことを実感しました - 私は実際にちょうど平等をチェックしています、それがすべてです。

+10

時期尚早な最適化には関係ありません。「DATEDIFF」を使用してクエリを作成し、それがボトルネックか、クエリプランを調べていないかを確認してください。それが問題なら、代替案を探してください。 – Welbog

+0

[SQL Serverの日時の時間部分を削除するための最良の方法]の可能な複製(http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-サーバー) – abatishchev

答えて

81

これを行うための唯一の合理的な方法は、datetime値の時刻部分を取り去り、結果を比較することで、日時からの時間の部分を除去するための最良の方法は、このようなものです:

cast(current_timestamp as date)  

私が使用して、次の2行のいずれかのように見えたプロセスを提唱するために使用:

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

をしかし、今SQL Serverが時間コンポーネントを保持していないDateタイプを、持っていること、のいずれかを使用するには少し理由がありますそれらの技術の

ここでもう1つ留意すべき点は、where句またはjoin条件の各行に対して2つのdatetime値に対して実行する必要がある場合でも、依然としてクエリを駄目にすることです。可能であれば、これを何らかの形で除外して、たとえばビューまたは計算列を使用して、できるだけ事前に計算されるようにします。

最後に、DATEDIFF関数は、交差する境界の数を比較することに注意してください。したがって、'2009-09-14 11:59:59''2009-09-15 00:00:01'の間の日付は、わずか2秒しか経過していませんが、'2009-09-15 00:00:01''2009-09-15 11:59:59'の間のDATEDIFFは、86,398秒が経過していても、ゼロです。そこには時間部分についてはまったく気にしないことに注意してください。クエリが何をしようとしているかに応じて、それをあなたの利点に利用できるかもしれません。私は2つの日付が等しかったことを確認したかった私自身の作品では、

+3

これは、単に_DATEDIFF(day、date1、date2)_を使用するより効率が悪くなりますか? –

+0

私は編集作業中だったので、準備が整いました。 –

+2

私は実際に時間を取り除く方法を探していませんでしたが、時間を無視して2つの日付を比較する方法でした。これは私に少し遅く見えます。 –

6

は関係なく、一日の時間を、私が使用した次:確か

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

は、「比較」には、平等よりもはるかにと上記では、比較を行う前に、日付をUSA形式のMM/DD/YYYYに変換しています。したがって、パフォーマンスの影響と日付の違いを比較できないこと。

しかし、それは動作します。

4

ビジネス要件の1つがデータモデルでうまく機能しない場合(たとえば、日付を比較する必要がありますが、日付を追跡するのではなく、日付プラス時間のみ)、モデルのチューニングの可能性を見て、それに対処する方法ではありません。

インデックス付きの計算列に日付のみを格納するか、日付と時刻の部分を別々に格納することは可能でしょうか。

33

WHERE DATEDIFF(日、日付1、日付2)= 0

2

申し訳ありません後半の答えのために。

私は常に我々はそれがyyyyMMdd形式で日付を返す112フォーマットコードで日付を変換するたびに、それは常に素晴らしい作品

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

日付の比較ですために、この構文を使用します。それは時間のない文字列形式の日付を比較しますが、うまくいきます。ありがとうございました

+0

あなたの解決策は、「IF date_column!= GETDATE()」が書かれていなかったスクリプトで働いていました。 これはなぜ起こっていますか? – CryptoJones

関連する問題