데이터베이스(Database)/Oracle

" ORA-01839: 지정된 월에 대한 날짜가 부적합합니다 " 에러 발생 시 해결 방법

leebaro 2018. 11. 2.
728x90

쿼리를 새로 만들때 ORA-01839 에러가 발생할 수 있고, 잘 돌아가던 쿼리가 ORA-01839 에러가 날 때가 있습니다.


일단 이 에러는 지정한 월에 대한 날짜가 부적합하다는 뜻입니다.


예를들어 2월 30일, 9월 31일일 같은 날이 부적합한 날짜라고 할 수 있습니다.


이런 에러를 발생 시키는 가장 큰 원인은 전월, 전년, 익월, 내년과 같은 과거 또는 미래의 날짜를 임의로 선택할 때 발생합니다.


더 구체적인 예를들어, 오늘이 2018년 10월 31일입니다. 제가 아래와 같은 쿼리를 수행하면 에러가 합니다.



#전 월을 YYYYMM 기준의 문자열로 받아오기.

SELECT TO_CHAR(SYSDATE - INTERVAL '1' MONTH,'YYYYMM') FROM DUAL;



이 쿼리는 내부적으로 아래와 같은 순서로 진행 됩니다.

  1. 오늘 날짜 구하기 -> 2018-10-31
  2. 오늘 날짜에서 1개월 이전으로 가기 -> 2018-09-31 ** 에러 **
  3. 날짜를 문자열로 만들기 -> 201809


전 월을 구할 때 없는 날자를 호출하니 에러가 발생합니다.


해결 방법은 아래와 같습니다. 


당월 1일 기준으로 전월을 구하라.


쿼리는 아래와 같습니다.



# TRUNC(SYSDATE,'MM')는 날짜읠 1일을 구하는 함수


SELECT  TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MM'),-1),'YYYYMM') FROM DUAL;



이 쿼리는 아래와 같은 순서로 진행횝니다.


  1. 오늘 날짜 구하기 -> 2018-10-31
  2. 이번 달의 1일 날짜 구하기 -> 2018-10-01
  3. 위의 날짜에서 1개월 이전 날짜로 가기 -> 2018-09-01
  4. 위의 날짜에서 연월 기준의 문자열 만들기 -> 201809


이런 에러는 특정일에만 발생하다보니 찾기 어렵고, 말일에 쿼리를 만드는 것이 아니면 그 날에는 잘 돌아가니 잠재적인 위험을 가진 로직이라고 할 수 있습니다.

이런 문제점을 미리 알고 준비 하시면, 서비스를 운영하다가 갑작스러운 장애를 맞이하는 위험을 줄여줄 수 있습니다.


728x90