さてさて、上記では特定の日を取得する方法を紹介しました。日付データに関する取り扱いとして、もう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
これは簡単ですね。では、これを「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
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
MONTHS_BETWEEN関数は、単純に日付と日付の間に何カ月間あるかを数えてくれる関数です。なので演算結果に端数が出てしまい、そのまま表示させると「2.2345カ月間」のような分かりにくくなってしまいます。これも先に解説したTRUNC関数で丸めるなどして、要件に応じた数値に加工して表示させた方が親切ですね。
今回は、いくつか日付データの演算を行ってみました。あまり使ったことのない関数もあったのではないでしょうか。次回は、日付に関するデータ型、Oracle9iから増えたTIMESTAMP型、期間データ型について解説する予定です。(次回に続く)
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.