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&)