非決定論的な関数に加えて、フィールドで計算を行うという問題があります。これにより、(通常) フィールドのインデックスがクエリで使用できなくなります。
このリンクの 2 番目の段落 (よくある SQL プログラミングの 10 の間違い (述語内のインデックス付き列に対する関数) ) は、これがいつ発生するか、それを回避する方法、およびオプティマイザーが関数の使用にもかかわらずインデックスを使用する可能性がある方法について、より詳細な情報を提供します。
要するに、改善されたオプティマイザーに頼る代わりに、フィールドをそのまま (計算を行わずに) 保持することでクエリを変更できることがよくありますが、代わりに他の値に対して (逆の) 計算を実行します。あなたの場合、 GetDate()
によって提供される現在の日付まで .次に、クエリはフィールド table1.Date
のインデックスを使用できます .
したがって、次のようなものを使用できます:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
また、当月の最初と最後の日を取得する関数を見つけるだけで済みます。
sql-server-query-to-find-first-and-last-day-of-当月/
さらに良いことに、この StackOverflow の質問/回答:月の初日を指定した日付を作成する最も簡単な方法-別の日付
テストする必要がありますが、上記のわずかなバリエーションで十分だと思います:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)