日付データ演算の達人技を伝授する 【第2話】SQLクリニック(3)(2/3 ページ)

» 2005年04月28日 00時00分 公開
[山下正株式会社インサイトテクノロジー]

期間データ型

 さて今回注目しておきたいのが期間データ型です。

  • データ型

 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;
リスト1 現在時刻から3時間25分30秒前の時刻を導出(その1)

となります。もしくは、ひっくるめて、

SQL> SELECT SYSDATE - 12330/86400 FROM dual;
リスト2 現在時刻から3時間25分30秒前の時刻を導出(その2)

としても同じ結果が得られます。

 上記のコーディングはすでに理解されていると思います。特に問題ないですね。しかし、可読性という意味ではさてどうでしょう? 少なくとも「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
リスト3 期間データ型の指定方法

 また、文字列の期間データ型への変換関数もあります。

TO_DSINTERVAL
TO_YMINTERVAL
リスト4 文字列の期間データ型への変換関数

 ではこれらを使って先の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
リスト5 前出のSQL(リスト1)
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
リスト6 期間データ型による演算(その1)

 あるいは、

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
リスト7 期間データ型による演算(その2)

 どうです。期間データ型を使うと、シンプルかつ可読性の高いSQLになったと思いませんか。この関数を使うと、なんと時分秒をそのまま書き込むことができます。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。