DB2 の datetime フィールドで関数を使用すると、データベースはそのインデックスを使用できなくなります (そのフィールドにインデックスが付けられている場合)。これは、関数によって処理された後のフィールドの結果ではなく、(ほとんどの場合) フィールド自体にインデックスが作成されるためです。これは、DB2 だけでなく、ほとんどのデータベースに当てはまります。
代わりに、1 日の始まりと 1 日の終わりに datetime 値を指定し、それらの間のすべてを取得する必要があります。このプロセスを簡素化するために、mysqldt.
. 元々、この形式は mySQL データベース用でしたが、SQL サーバーと DB2 はどちらも同じ形式を使用しているため、これらでも使用できます。
proc format;
picture mysqldt low-high = '''%Y-%0m-%0d %0H:%0M:%0S''' (datatype = datetime) ;
run ;
この形式が利用可能になると、私はマクロ変数を使用する傾向があります。プログラムの先頭で、レポート全体で使用する日付を指定するマクロ変数を作成します。
%let rpt_date = %sysfunc(mdy(1,12,2013));
次に、1 日の開始と終了を表す 2 つの日時フィールドを作成し、SQL ステートメントに必要な形式で保存します。
%let sql_start = %sysfunc(dhms(&rpt_date, 0, 0, 0), mysqldt.);
%let sql_end = %sysfunc(dhms(&rpt_date,23,59,59), mysqldt.);
%put &rpt_date &sql_start &sql_end;
次に、クエリを次のように変更します。
proc sql;
connect to db2(ssid=smtng);
select * from connection to db2
(select *
from atable
where timestamp between &sql_start and &sql_end
for read only with ur
);
quit;
このようにして、インデックスがクエリで使用されるようになっただけでなく、SQL がよりきれいに見えて読みやすくなり、レポートの日付を 1 か所 (プログラムの上部) で変更するだけで、レポートを再実行する必要があります。報告。