말랑말랑제리스타일

오라클 Interval month로 날짜 연산시 지정한 월 에러 본문

데이터베이스/Oracle SQL

오라클 Interval month로 날짜 연산시 지정한 월 에러

제리제리 2023. 5. 30. 15:22

오라클에서 잘 쓰던 프로시저가 갑자기 "Ora-01839 : 지정한 월에 대한 날짜가 부적합합니다."라는 에러를 뱉는 경우가 생겼는데요. 이런 경우 Inverval month를 사용해서 날짜 연산을 한 경우일 수 있습니다. 이 에러가 발생하는 상황과 변경 쿼리에 관한 내용을 알아봅시다.

오라클 01839 에러 화면
오라클 01839 에러 화면

오라클에서 Interval month로 날짜 연산 시 에러 발생하는 상황

반응형

오라클에서 Interval month로 날짜를 계산할 경우 앞서 말한 것처럼 "Ora-01839 : 지정한 월에 대한 날짜가 부적합합니다."라는 에러가 발생할 수 있는데요.

이 에러가 발생하는 상황을 확인해보면 연산의 결과에 해당하는 날짜가 해당 월의 마지막 날을 지나는 경우 발생합니다.

예를 들어 5월 30일 기준으로 아래 쿼리를 실행했다고 합니다.

SYSDATE + (INTERVAL '9' MONTH)

5월 30일에 단순히 9개월을 더하면 2월 30일이 되겠죠?

하지만 2월 30일은 존재하지 않기 때문에 우리가 원하는 결과는 2월 29일 내지 2월 28일이 될 겁니다.

하지만 오라클에서 Interval month로 조회할 경우 단순히 2월 30일은 존재하지 않기 때문에 지정한 월에 대한 날짜가 부적합하다는 에러를 뱉어내는 거죠.

 

오라클에서 Interval month 대신 사용할 수 있는 함수

반응형

오라클에서는 다양한 날짜 연산 함수를 지원합니다.

그중 Interval month를 대신할 수 있는 함수로는 ADD_MONTHS라는 함수가 있는데요.

말 그대로 월을 더해주는 함수이고 Interval month를 사용하면서 발생한 지정한 월에 대한 날짜가 부적합하다는 에러는 발생하지 않습니다.

상단의 쿼리를 ADD_MONTHS 함수를 이용해 에러가 나지 않게 수정하면 아래와 같이 됩니다.

ADD_MONTHS(SYSDATE,9)

지금 시점에 9개월을 더한 날짜를 표시해 주는 기능이고, 상단의 2월 30일이 될 경우 발생하는 에러는 내부적으로 처리가 되어 2월 29일 내지 28일로 바뀌어서 출력됩니다.

예시로 현재 날짜가 2023년 5월 30일이라면 2024년 2월 29일이, 5월 31일이라도 24년 2월 29일이 출력되는 거죠.

반응형
Comments