본문 바로가기
Oracle

[Oracle] ORA-01839 : "지정된 월에 대한 날짜가 부적합합니다" 해결 feat. ChatGPT

by 상후 2023. 4. 4.
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
반응형

댓글