회사에서 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
'프로그래밍 > DB' 카테고리의 다른 글
[DB] Oracle PIVOT 사용 방법 및 조회 시 성능 주의사항 (0) | 2024.03.11 |
---|---|
[DB] H2 데이터베이스 조회 시 한글 깨짐 수정 (0) | 2022.10.01 |
[DB] H2 데이터베이스 설정 초기화 (0) | 2022.09.28 |
[DB] Oracle 특정 값 max/min 에 대한 column 선택 (0) | 2022.06.08 |
[DB] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (0) | 2019.08.29 |