Oracle SQL 関数 : MONTHS_BETWEEN : 月数の計算
dateRet := MONTHS_BETWEEN( date1 , date2 ); MONTHS_BETWEENはdate1とdate2の間の月数を返します。date1がdate2より大きい場合は正の値を、また date2がdate1より大きい場合は負の値を返します。同一日での比較の場合、及び月末同士の比較の場合は 結果は整数の値になります。その他の場合は、1ヶ月を31日とした換算値が返されます。
SQL> SELECT 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 13 FROM DUAL; 月違い同一日 同上負値 一日違い 閏年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; AGE ---------- 40