Database/Oracle Database

[오라클] ADD_MONTHS와 NUMTOYMINTERVAL 차이 및 주의점

Dong538 2022. 1. 16. 17:22

- add_months:

add_months(특정월말, 1) - 월말 기준으로 1개월을 더해 다음월말을 출력

- numtoyminterval:

특정월말 + numtoyminterval(1, 'month') - 30일 이후를 반환.. 즉 n개월 후인 달이 총 몇일인지(28,29,30,31등)을 고려하지 않음

 

예:

SQL> SELECT DT, ADD_MONTHS(DT,1)
  2  FROM (SELECT TO_DATE('29-FEB-2000','DD-MON-YYYY') DT FROM DUAL);

DT                  ADD_MONTHS(DT,1)
------------------- -------------------
2000-02-29 00:00:00 2000-03-31 00:00:00

SQL> SELECT DT, DT+NUMTOYMINTERVAL(1,'month')
  2  FROM (SELECT TO_DATE('29-FEB-2000','DD-MON-YYYY') DT FROM DUAL);

DT                  DT+NUMTOYMINTERVAL(
------------------- -------------------
2000-02-29 00:00:00 2000-03-29 00:00:00

 

사실 위의 경우 주의점을 알고 있는 상태에서 사용은 가능하지만 아래처럼 n개월 후인 달에서 (28, 29, 30, 31)일이 없는 달이라면 쿼리 시 에러가 발생합니다.

 

예: (참고 - 2001년 2월은 28일이 마지막 날)

SQL> select dt, dt + numtoyminterval(1, 'month')
   2 from (select to_date('2001-01-29', 'yyyy-mm-dd') dt from dual)
select dt, dt + numtoyminterval(1, 'month')
              *
ERROR at line 1:
ORA-01839: date not valid for month specified


SQL> select dt, dt + numtoyminterval(1, 'month')
   2 from (select to_date('2001-01-28', 'yyyy-mm-dd') dt from dual)

DT                  DT+NUMTOYMINTERVAL(
------------------- -------------------
2001-01-28 00:00:00 2001-02-28 00:00:00

 

(참고 - http://wiki.gurubee.net/pages/viewpage.action?pageId=28117355&