さて今回注目しておきたいのが期間データ型です。
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
前回の日付データの演算では、時間や分の演算の際に、1/24(1時間)あるいは1/24/60(1分間)を加減算して必要な日時を取得しました。
初めて日付データの演算に触れたプログラマの方は、割り算の連続で導出する方法に「何だこりゃ」と思ったことでしょう。でも慣れると考え方がシンプルなのですぐに応用できます。例えば、1秒間は1/24/60/60日ですよね。あとは、必要な時間分それぞれに掛け算すればOKです。
現在時刻から3時間25分30秒前の時刻を導出するときは、
SQL> SELECT SYSDATE - ( 3*1/24 + 25*1/24/60 + 30*1/24/60/60 ) FROM dual;
となります。もしくは、ひっくるめて、
SQL> SELECT SYSDATE - 12330/86400 FROM dual;
としても同じ結果が得られます。
上記のコーディングはすでに理解されていると思います。特に問題ないですね。しかし、可読性という意味ではさてどうでしょう? 少なくとも「12330/86400」はコーディングした本人でも分からなくなりそうです。
「自分しかメンテナンスしないから大丈夫」
なんていわないでください。この業界には、
「3日たてば他人のコード」
という先人の格言があります。読みやすいコードに文句をいう人はいません(多分)。
さてこのようなSQLがOracle9iから追加された期間データ型を用いるとどうなるか……、その前に期間データ型の一覧を挙げておきましょう。期間データ型としては以下のような指定方法があります。
INTERVAL 'n' YEAR INTERVAL 'n' MONTH INTERVAL 'n' DAY INTERVAL 'n' MINUTE INTERVAL 'n' SECOND INTERVAL 'y-m' YEAR TO MONTH INTERVAL 'd hh24:mi:ss.ff' DAY TO SECOND
また、文字列の期間データ型への変換関数もあります。
TO_DSINTERVAL TO_YMINTERVAL
ではこれらを使って先のSQLを書き直してみましょう。まずは、日付フォーマットを見やすく変更してから確認します。
SQL> ALTER SESSION SET nls_date_format = 'yyyy/mm/dd hh24:mi:ss'; SQL> SELECT SYSDATE, SYSDATE - (3*1/24+25*1/24/60 + 30*1/24/60/60) TARGET_DATE FROM dual; SYSDATE TARGET_DATE ------------------- ------------------- 2005/04/08 02:38:30 2005/04/07 23:13:00
SQL> SELECT SYSDATE , SYSDATE - TO_DSINTERVAL('0 03:25:30') TARGET_DATE FROM dual; SYSDATE TARGET_DATE ------------------- ------------------- 2005/04/08 02:40:23 2005/04/07 23:14:53
あるいは、
SQL> SELECT SYSDATE , SYSDATE - INTERVAL '0 03:25:30' DAY TO SECOND TARGET_DATE FROM dual; SYSDATE TARGET_DATE ------------------- ------------------- 2005/04/08 02:41:33 2005/04/07 23:16:03
どうです。期間データ型を使うと、シンプルかつ可読性の高いSQLになったと思いませんか。この関数を使うと、なんと時分秒をそのまま書き込むことができます。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.