728x90
쿼리를 새로 만들때 ORA-01839 에러가 발생할 수 있고, 잘 돌아가던 쿼리가 ORA-01839 에러가 날 때가 있습니다.
일단 이 에러는 지정한 월에 대한 날짜가 부적합하다는 뜻입니다.
예를들어 2월 30일, 9월 31일일 같은 날이 부적합한 날짜라고 할 수 있습니다.
이런 에러를 발생 시키는 가장 큰 원인은 전월, 전년, 익월, 내년과 같은 과거 또는 미래의 날짜를 임의로 선택할 때 발생합니다.
더 구체적인 예를들어, 오늘이 2018년 10월 31일입니다. 제가 아래와 같은 쿼리를 수행하면 에러가 합니다.
#전 월을 YYYYMM 기준의 문자열로 받아오기. SELECT TO_CHAR(SYSDATE - INTERVAL '1' MONTH,'YYYYMM') FROM DUAL; |
이 쿼리는 내부적으로 아래와 같은 순서로 진행 됩니다.
- 오늘 날짜 구하기 -> 2018-10-31
- 오늘 날짜에서 1개월 이전으로 가기 -> 2018-09-31 ** 에러 **
- 날짜를 문자열로 만들기 -> 201809
전 월을 구할 때 없는 날자를 호출하니 에러가 발생합니다.
해결 방법은 아래와 같습니다.
당월 1일 기준으로 전월을 구하라.
쿼리는 아래와 같습니다.
# TRUNC(SYSDATE,'MM')는 날짜읠 1일을 구하는 함수 SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MM'),-1),'YYYYMM') FROM DUAL; |
이 쿼리는 아래와 같은 순서로 진행횝니다.
- 오늘 날짜 구하기 -> 2018-10-31
- 이번 달의 1일 날짜 구하기 -> 2018-10-01
- 위의 날짜에서 1개월 이전 날짜로 가기 -> 2018-09-01
- 위의 날짜에서 연월 기준의 문자열 만들기 -> 201809
이런 에러는 특정일에만 발생하다보니 찾기 어렵고, 말일에 쿼리를 만드는 것이 아니면 그 날에는 잘 돌아가니 잠재적인 위험을 가진 로직이라고 할 수 있습니다.
이런 문제점을 미리 알고 준비 하시면, 서비스를 운영하다가 갑작스러운 장애를 맞이하는 위험을 줄여줄 수 있습니다.
728x90