2012-03-16 15 views
2

日付フィールドには、タスクの未完了を示すデフォルト値があります。 デフォルトの日付が12/31/9999の場合、完了したすべてのタスクを検索してより良い結果が得られますか?SQLの日付クエリ: 'より小さい'より小さい 'より小さい'

SELECT * FROM Table WHERE Completed <> '12/31/9999' 

OR

SELECT * FROM Table WHERE Completed < '12/31/9999' 

またはそれは完全に私のインデックスに依存しません。

+2

完了日がない場合は、NULLを使用する意味が分かりませんか? –

+2

これは初めて文書化されたY10Kバグですか? –

答えて

9

WHERE句で使用される主要な演算子は、パフォーマンスによって順序付けられます。トップにいる事業者は、最下位にリストされている事業者よりも速く業績を出します。

= 
>, >=, <, <= 
LIKE 
<> 

http://www.sql-server-performance.com/2007/t-sql-where/

+1

そのリストに 'LIKE'を配置するのはやや恣意的です。それは '='(ワイルドカードがない場合)またはbottom(もしワイルドカードを指す場合)のいずれかに行くことができます –

+0

ありがとう、これは適用するための一般的なルールのようです。私はdbaではないので – Nate

0

私はあなたの問題をよく理解していませんでしたが、この種の比較はインデックスにのみ依存しています。

1

ないくらいの差が、おそらく。

Completedのインデックスがクエリを満たすために使用される場合、<>は、2つの範囲であろうが(< '12/31/9999'> '12/31/9999')を求めているだけでなく<シーク。

したがって、<を使用すると、不必要な追加を避けるために、>シークは何も返しません。

+0

ありがとう、これは私がクエリの求めている側面を理解するのに役立ちます。 – Nate

0

あなたは言った:

それは、そのフィールドがNULL可能であることと作るために、より理にかなっているタスク

の非完了したことを示し、私はデフォルトの値を持つ日付フィールドで

デフォルト値はnullになります。したがって、そのフィールドの日付の不在は、タスクが完了していないことを意味します。

テーブルを変更してデフォルト値をnullに設定し、compeleted = '12/31/9999'のすべての値をnullに設定することで、簡単に解決できます。次に、実行するクエリは次のようになります。

SELECT * FROM Table WHERE Completed IS NOT NULL 
+0

ちょうどこれとは別に。私はnullの代わりにゼロとして日付を格納することを決定するいくつかのデータベースを見てきました。その練習を避けるようにしてください。後で質問すると実際の問題を引き起こす可能性があります。ただそれらをnullのままにしておきます。 – Rob

関連する問題