連載
» 2005年03月26日 00時00分 公開

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

[山下正,株式会社インサイトテクノロジー]
前のページへ 1|2|3       

期間の取得

 さてさて、上記では特定の日を取得する方法を紹介しました。日付データに関する取り扱いとして、もう1つ押さえておきたいポイントがあります。それは期間です。

【月の差分(MONTHS_BETWEEN)】

 特定の日と日の間の“日数”を求める場合は、非常に簡単です。DATE型の引き算で求めることができますね。この場合、例えば下記のようなSQLで、「195日間」という結果を取得することができます。

SQL>  select   to_date('2005/02/14','yyyy/mm/dd')
  2          - to_date('2004/08/03','yyyy/mm/dd') duration
  3   from dual;
  DURATION
----------
       195
リスト10 特定の日と日の間の“日数”を求める

 これは簡単ですね。では、これを「6カ月と11日間」という表現にするにはどうしましょうか。こちらの表現の方が期間の長さを感覚的につかみやすい人が多いのではないでしょうか。

 こんな場合、MONTHS_BETWEEN関数が便利です。TRUNC関数や、ADD_MONTHS関数と組み合わせて表示してみます。

select  TRUNC(months_between( date2, date1 )) months
      , TRUNC(date2
              - ADD_MONTHS( date1, 
                       TRUNC(months_between( date2 ,date1 )))
            ) days
from dual
リスト11 関数を組み合わせた期間の計算

 date1とdate2に先ほどの日付をセットして実行してみましょう。次のような結果が得られます。

SQL> select  TRUNC(months_between( to_date('2005/02/14','yyyy/mm/dd')
  2                    , to_date('2004/08/03','yyyy/mm/dd') )) months
  3    , TRUNC(to_date('2005/02/14','yyyy/mm/dd')
  4      - ADD_MONTHS( to_date('2004/08/03','yyyy/mm/dd')
  5        , TRUNC(months_between( to_date('2005/02/14','yyyy/mm/dd')
  6                           ,to_date('2004/08/03','yyyy/mm/dd') )))
  7          ) days
  8  from dual;
    MONTHS       DAYS
---------- ----------
         6         11
リスト12 関数を組み合わせた期間の計算(実行例)

 MONTHS_BETWEEN関数は、単純に日付と日付の間に何カ月間あるかを数えてくれる関数です。なので演算結果に端数が出てしまい、そのまま表示させると「2.2345カ月間」のような分かりにくくなってしまいます。これも先に解説したTRUNC関数で丸めるなどして、要件に応じた数値に加工して表示させた方が親切ですね。


 今回は、いくつか日付データの演算を行ってみました。あまり使ったことのない関数もあったのではないでしょうか。次回は、日付に関するデータ型、Oracle9iから増えたTIMESTAMP型、期間データ型について解説する予定です。(次回に続く)

筆者紹介

株式会社インサイトテクノロジー

Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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