본문 바로가기

개발일지/SQL

[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으로 타입을 고쳐서 반영할 때도 이런 느낌이었는데!! 그래도 옛날 같았으면 오랫동안 감이 안 잡혔을 것 같은데 금방 수정한 점에서 혼자 묘한 감동을 느낌 히...