2009年11月11日水曜日

時刻切り捨ての日付比較のsql文

時刻を無視して、日付だけでシステム日付と比較するSQL

SELECT COL_1,COL_2,...
FROM TABLE_1
WHERE
CONVERT(char, TABLE_1.LastReportDateTime,111) <= CONVERT(char, DATEADD(d, -7, CURRENT_TIMESTAMP), 111)
みたいなものを昔書いた覚えがあるけど、今考えると効率面でよくなかったですね。
問題は2点。TABLE_1の全行に対して、CONVERT関数を呼び出していることと、関数を呼び出した後の比較のため、インデックスが張ってあっても、条件の絞り込みには使えないこと。

以下のように書けば、CONVERT関数を処理するのはCURRENT_TIMESTAMPの1件(SQL処理中はCURRENT_TIMESTAMPは固定値なので)でインデックスが張ってある時に範囲外のものは比較しないで対象外にしてくれそう。
SELECT COL_1,COL_2,...
FROM TABLE_1
WHERE
TABLE_1.LastReportDateTime < CONVERT(char, DATEADD(d, -6, CURRENT_TIMESTAMP), 111)

0 件のコメント: