Oracle SQL 関数 : MONTHS_BETWEEN : 月数の計算
dateRet := MONTHS_BETWEEN( date1 , date2 );
MONTHS_BETWEENはdate1とdate2の間の月数を返します。date1がdate2より大きい場合は正の値を、また
date2がdate1より大きい場合は負の値を返します。同一日での比較の場合、及び月末同士の比較の場合は
結果は整数の値になります。その他の場合は、1ヶ月を31日とした換算値が返されます。
2 MONTHS_BETWEEN(TO_DATE( '2004/02/14' ), TO_DATE( '2004/01/14' )) AS 月違いの同一日 |
3 ,MONTHS_BETWEEN(TO_DATE( '2004/01/14' ), TO_DATE( '2004/02/14' )) AS 同上負値 |
4 ,MONTHS_BETWEEN(TO_DATE( '2004/01/14' ), TO_DATE( '2004/01/13' )) AS 一日違い |
5 ,MONTHS_BETWEEN(TO_DATE( '2004/02/29' ), TO_DATE( '2004/01/27' )) AS 閏年1 |
6 ,MONTHS_BETWEEN(TO_DATE( '2004/02/29' ), TO_DATE( '2004/01/28' )) AS 閏年2 |
7 ,MONTHS_BETWEEN(TO_DATE( '2004/02/29' ), TO_DATE( '2004/01/29' )) AS 閏年3 |
8 ,MONTHS_BETWEEN(TO_DATE( '2004/02/29' ), TO_DATE( '2004/01/30' )) AS 閏年4 |
9 ,MONTHS_BETWEEN(TO_DATE( '2004/02/29' ), TO_DATE( '2004/01/31' )) AS 閏年5 |
10 ,MONTHS_BETWEEN(TO_DATE( '2004/11/30' ), TO_DATE( '2004/10/29' )) AS T29 |
11 ,MONTHS_BETWEEN(TO_DATE( '2004/11/30' ), TO_DATE( '2004/10/30' )) AS T30 |
12 ,MONTHS_BETWEEN(TO_DATE( '2004/11/30' ), TO_DATE( '2004/10/31' )) AS T31 |
月違い同一日 同上負値 一日違い 閏年1 閏年2 閏年3 閏年4 閏年5 T29 T30 T31 |
1 -1 .032258065 1.06451613 1.03225806 1 .967741935 1 1.03225806 1 1 |
上記に、いろいろな場合のMONTHS_BETWEENの結果を表示しています。
少し問題があるとすれば、閏年の場合には29日を1ヶ月として計算しているようである。
但し、1月31日には月末の処理がなされて結果は1ヶ月の差として返されている。このあたりは、月数を処理する場合には注意が必要かもしれません。
尚、MONTHS_BETWEENの応用として、年齢の計算について以下に示します。
SQL> SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE( '1964/10/12' )) / 12) AS AGE FROM DUAL; |
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。