말랑말랑제리스타일
오라클 Interval month로 날짜 연산시 지정한 월 에러 본문
오라클에서 잘 쓰던 프로시저가 갑자기 "Ora-01839 : 지정한 월에 대한 날짜가 부적합합니다."라는 에러를 뱉는 경우가 생겼는데요. 이런 경우 Inverval month를 사용해서 날짜 연산을 한 경우일 수 있습니다. 이 에러가 발생하는 상황과 변경 쿼리에 관한 내용을 알아봅시다.
오라클에서 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일이 출력되는 거죠.
'데이터베이스 > Oracle SQL' 카테고리의 다른 글
SQLD, SQLP 자격증 비전공자도 취득 가능한지 여부 (0) | 2023.07.05 |
---|---|
오라클 LIKE 절에 탈출 문자 사용법 (0) | 2023.06.13 |
[오라클 DB] LISTAGG 반대로 콤마로 구분된 문자열 분해하기 (0) | 2023.02.17 |
[오라클 DB] 데이터 INSERT 이후 속도 저하 현상 (0) | 2023.02.15 |
토드 에러 TNS Names 파일이 없다고 나올 때 해결 방법 (0) | 2023.01.04 |