2월29일이 있던 작년, 배치고 서비스고 날짜 계산 부분에 2월만 포함되어 있다하면 에러가 발생하였는데 ;;
INTERVAL -> ADD_MONTHS()로 변경하여 해결했던 적이 있다. 그런데 두 개의 차이점과 특징, 왜 INTERVAL이 에러가 나는지에 대해 설명해보라고 하면 ..엄 .. INTERVAL만 사용하면 에러나서요 .. ;; 남에게 이해 시킬 정도의 설명을 못 해서 정확히 짚고 넘어가고자 한다.
INTERVAL vs ADD_MONTHS
날짜와 시간을 다룰 때 자주 사용되는 SQL 함수.
두 함수는 각각의 특징과 사용 방법에 차이가 있다. 특징을 비교해보겠다.
1. INTERVAL
INTERVAL은 날짜와 시간 간격을 표현하는 SQL 예약어이다. 다양한 시간 단위(일, 월, 년 등)를 사용하여 날짜와 시간을 다룰 수 있다.
특징
- 간격 표현: INTERVAL은 일, 월, 년, 시간, 분, 초 등 다양한 시간 단위로 날짜 간격을 표현할 수 있다.
- 정밀도: 시간 간격을 보다 세밀하게 다룰 수 있다. 예를 들어, 1일, 2개월, 3년 등의 계산이 가능하다.
- 윤년 처리: 2월 29일을 다룰 때 윤년을 제대로 처리하지 못할 수 있다. 예를 들어, 2020년 2월 29일에서 1년을 더하면 2021년 2월 28일로 계산된다.
사용 예시
SELECT CURRENT_DATE + INTERVAL '10' DAY; -- 현재 날짜에 10일 더하기
SELECT CURRENT_DATE - INTERVAL '3' MONTH; -- 현재 날짜에서 3개월 빼기
SELECT CURRENT_DATE + INTERVAL '1' YEAR; -- 현재 날짜에 1년 더하기
장점
- 다양한 시간 단위를 다룰 수 있어 매우 유연하다.
- 날짜와 시간 간격 계산에 강력하다.
단점
- 윤년 처리에서 문제가 발생할 수 있다.
- 정확한 월 단위 계산이 필요할 때 주의해야 한다.
2. ADD_MONTHS
ADD_MONTHS는 월 단위로 날짜를 더하거나 빼는 함수이다. 윤년을 자동으로 고려하여 정확히 몇 개월을 더하거나 빼는 데 사용된다.
특징
- 월 단위로 계산: ADD_MONTHS는 개월 수만 계산한다.
- 윤년 자동 처리: ADD_MONTHS는 윤년을 자동으로 처리한다. 예를 들어, 2020년 2월 29일에서 1년을 더하면 윤년에 따라 2월 28일 또는 2월 29일로 정확히 계산된다.
- 다른 시간 단위 사용 불가: 월 단위만 계산할 수 있으며, 일, 년, 시간 단위로는 사용할 수 없다.
사용 예시
SELECT ADD_MONTHS(CURRENT_DATE, 3); -- 현재 날짜에 3개월 더하기
SELECT ADD_MONTHS(CURRENT_DATE, -6); -- 현재 날짜에서 6개월 빼기
장점
- 윤년 처리가 자동으로 되므로 날짜 계산이 정확하다.
- 월 단위 계산에 매우 유용하고 간편하다.
단점
- 월 단위만 다룰 수 있기 때문에, 일이나 연 단위의 계산에는 사용할 수 없다.
- 다양한 시간 단위를 지원하지 않아서 다른 계산을 원할 경우 제한적이다.
INTERVAL vs ADD_MONTHS 비교
특징 INTERVAL ADD_MONTHS
사용 목적 | 날짜/시간 간격을 표현하고 계산 | 월 단위로 날짜를 더하거나 빼는 함수 |
지원하는 단위 | 일, 월, 년, 시간, 분, 초 등 다양한 시간 단위 | 오직 월 단위만 지원 |
윤년 처리 | 윤년을 고려하지 않는다. (예: 2월 29일에서 날짜를 더하거나 빼면 문제 발생 가능) | 윤년을 자동으로 처리한다. (2월 29일을 적절히 처리) |
주요 용도 | 다양한 날짜/시간 간격 계산 | 월 단위로 날짜를 정확하게 계산할 때 |
장점 | 유연함 (일, 월, 년 등 다양한 단위로 계산 가능) | 윤년을 자동으로 처리하고, 간단한 월 계산에 유용하다. |
단점 | 윤년 처리에서 예상치 못한 오류 발생 가능 | 월 단위만 지원하고, 다른 단위로 계산할 수 없다. |
결론
- **INTERVAL**은 다양한 시간 단위로 계산할 수 있지만, 윤년을 고려한 날짜 계산에서 문제가 발생할 수 있다. 날짜 간격 계산이 복잡한 경우 유용하지만, 윤년 처리가 중요한 경우에는 사용에 주의해야 한다.
- **ADD_MONTHS**는 월 단위로 날짜를 더하거나 빼는 데 최적화된 함수로, 윤년 문제를 자동으로 처리해주기 때문에 월 단위 날짜 계산에 매우 적합하다.
따라서, 윤년과 월 계산에 대해 정확한 결과를 얻고 싶다면 ADD_MONTHS를 사용하는 것이 더 안전하고 효율적이다.
'Backend' 카테고리의 다른 글
Oracle 제약조건 종류와 사용 방법 (0) | 2025.03.15 |
---|---|
Mybatis if null 체크하기 (1) | 2025.03.09 |
302 Found (0) | 2025.03.02 |
SELECT ... FOR UPDATE 사용하기 (0) | 2025.02.16 |
JPA 와 MyBatis 차이 (0) | 2025.02.09 |