728x90
반응형
ORA-01839 : 지정된 월에 대한 날짜가 부적합합니다.
ORA-01839: date not valid for month specified
평소에는 잘 실행되고 있던 쿼리가 갑자기 ORA-01839 에러와 함께 실패했습니다.
오라클 버전은 11g 입니다.
발생 원인
에러 메시지에 나와있듯이 날짜 연산에 관한 에러입니다.
테스트 케이스
-- 해당 쿼리의 결과 값은?
SELECT TO_DATE('2023-03-31', 'YYYY-MM-DD') - INTERVAL '1' MONTH
FROM DUAL;
SELECT TO_DATE('2024-02-29', 'YYYY-MM-DD') - INTERVAL '1' YEAR
FROM DUAL;
날짜 연산을 할 때 INTERVAL을 활용하여 연산이 가능합니다.
DAY나 시간에서는 문제가 되지 않지만, MONTH, YEAR에서는 문제가 발생합니다.
위 쿼리에서는 3월31일에서 1달을 뺐으니 2월 28일을 기대할 수 있습니다.
아래 쿼리에서는 2월29일(윤달)에서 1년을 뺐으니 2월 28일을 기대할 수 있습니다.
하지만 위 쿼리는 모두 ORA-01839 에러를 발생시킵니다.
단순하게 월/년에서 1을 빼버리기 때문입니다.
2023-03-31 -> 2023-02-31
2024-02-29 -> 2023-02-29
와 같은 결과로 없는 날짜를 호출하니 에러가 발생하는 것입니다.
해결 방법
ADD_MONTHS() 함수를 사용하면 위와 같은 상황을 예방 및 해결할 수 있습니다.
SELECT ADD_MONTHS(TO_DATE('2023-03-31', 'YYYY-MM-DD'), -1)
FROM DUAL; -- 2023-02-28
SELECT ADD_MONTHS(TO_DATE('2024-02-29', 'YYYY-MM-DD'), -12)
FROM DUAL; -- 2023-02-28
해당 문제를 접한 뒤 패키지 내 쿼리들을 점검하여 INTERVAL + MONTH/YEAR 로 날짜 연산을 하는 부분을 모두 수정하였습니다.
MONTH는 매월 말마다 간혹 발견될 수 있지만,
YEAR는 윤달에만 해당 에러가 발생할 수 있어 지나칠 수 있는 문제입니다.
ADD_MONTHS()를 사용하는 습관을 들여야겠습니다.
요즘 핫한 ChatGPT 시험하기
..?
ㅋㅋㅋㅋ 이눔..
요즘 유용하게도 쓰고, 재미있게 사용하는 ChatGPT..
도움도 많이 주지만, 너무 맹신하면 안 되겠다.
728x90
반응형
'Oracle' 카테고리의 다른 글
[Oracle] NVARCHAR2에서 VARCHAR2로 형 변환 하기 (0) | 2023.10.04 |
---|---|
[Oracle] LISTAGG 사용 시 적용 안 되는 케이스(NVARCHAR2) (0) | 2023.10.04 |
DBCP(Database Connection Pool) validationQuery 설정 (0) | 2022.06.18 |
[ORACLE] ORA-03113 : Merge 사용 시 에러 발생 (0) | 2022.04.20 |
[Oracle] 테이블 생성 시간/정보 확인하기 (0) | 2022.03.26 |
댓글