[Oracle SQL] 31일 에러가 있다면 믿어지십니까?
- 무신경하게 사용한 조건절의 인터벌이 당신을 놀라게 만들 수 있다.
어제까지만해도 잘 돌아가고 있던 기능이 갑자기 에러가 난다고 요청이 들어옴. 로컬 환경에서 테스트 할 땐 또 에러 안 나는 거 아니야~~? 하고 실행하자마자
아래와 같은 에러가 발생하고 있었다.
# 오류코드
# ORA-01839: 지정된 월에 대한 날짜가 부적합합니다.
날짜? 웬 날짜..
날짜 관련된 조건절들을 디버깅해보니 아래 부분에서 나는 에러
# 에러코드
-- INTERVAL '6' MONTH
AND TO_DATE(TEST_DATE, 'YYYYMMDD') <![CDATA[>=]]> SYSDATE - INTERVAL '6' MONTH
에러 이유 : 오늘은 2024-12-31 6개월 전은 2024-06-31 이어야하지만 해당 월은 30일까지 있으므로 거짓
하 이 하찮은 놈 ㅠ 대체 할만한 명령어를 찾아 아래와 같이 바꿔줌
# 해결방법
-- ADD_MONTHS(SYSDATE, -6)
AND TO_DATE(TEST_DATE, 'YYYYMMDD') <![CDATA[>=]]> ADD_MONTHS(SYSDATE, -6)
따라서, INTERVAL 대신 ADD_MONTHS를 무조건 사용해야 함
ADD_MONTHS은 존재하는 날짜 중 가장 가까운 날짜를 출력하기 때문
깨달은 점 :
쿼리의 경우 서버에 악영향을 줄 수 있으니 새로운 명령어 사용 시 신중한 선택이 필수
단순히 경고 수준으로 끝나서 너무너무너무 다행이었고, 그게 아니었다면 월말 + 연말 영업시간에 운영 서버에 문제가 생긴다 ? 상상하기도 싫고요. 21세기엔 너무 당연한 기능이지만 당연함이라는 게 참 인간 중심의 사고 라는 걸 다시 한 번 느꼈다.
근데 머랄까 반성과 별개로 평소에 보기드문 신기한 에러였음
마치 올해 초 금액 관련 계산식에서 범위가 int형을 넘어가서 자료형 에러가 났던 것처럼. 선배님들이 호다닥 long으로 타입을 고쳐서 반영할 때도 이런 느낌이었는데!! 그래도 옛날 같았으면 오랫동안 감이 안 잡혔을 것 같은데 금방 수정한 점에서 혼자 묘한 감동을 느낌 히...