회사에서 INTERVAL을 사용하는 쿼리 때문에 장애가 발생해서 남기는 글이다.

 

Oracle에서 날짜를 더하거나 뺄 때 두 가지 방법이 있는데 하나는 INTERVAL을 사용하는 것이고, 다른 하나는 ADD_MONTHS를 사용하는 것이다.

 

INTERVAL은 아래와 같이 사용할 수 있다.

SELECT 
    SYSDATE - (INTERVAL '1' YEAR)
    , SYSDATE + (INTERVAL '1' YEAR)
    , SYSDATE + (INTERVAL '1' MONTH)
    , SYSDATE + (INTERVAL '1' DAY)
    , SYSDATE + (INTERVAL '1' HOUR)
    , SYSDATE + (INTERVAL '1' MINUTE)
    , SYSDATE + (INTERVAL '1' SECOND)
FROM
    DUAL

하지만 이 방법은 년 또는 월 단위로 더하거나 뺄 경우 주의해서 사용해야 하는데 그 이유는 윤년이다.

SELECT
    TO_DATE('2024-02-29', 'yyyy-mm-dd') + (INTERVAL '1' YEAR)
FROM
    DUAL
SELECT
    TO_DATE('2023-01-29', 'yyyy-mm-dd') + (INTERVAL '1' MONTH)
FROM
    DUAL

위 두 개의 쿼리를 실행하면 아래와 같은 오류가 나타나면서 정상적으로 실행되지 않는다. 이유는 윤년이기 때문에 날짜가 부적합하기 때문이다.

ORA-01839: date not valid for month specified. (지정된 월에 대한 날짜가 부적합합니다).

위의 쿼리에서 YEAR 의 경우 4로 변경하고, 아래 쿼리의 경우 2023년을 2024년으로 바꾸면 제대로 동작이 된다. 하지만, 사용하기 번거롭고 오류가 날 가능성이 높다.

 

회사에서는 이런 이유 때문에 ADD_MONTHS를 주로 사용한다.

위의 쿼리를 아래처럼 변경하면 쉽게 윤년 문제를 해결할 수도 있고 쉽게 이용도 가능하다.

SELECT
    ADD_MONTHS(TO_DATE('2024-02-29', 'yyyy-mm-dd'), 12 * 1) -- 2025-02-28
FROM
    DUAL
SELECT
    ADD_MONTHS(TO_DATE('2023-01-29', 'yyyy-mm-dd'), 1) -- 2023-02-28
FROM
    DUAL