본문 바로가기
Backend

[ORACLE] 날짜 계산 시 INTERVAL vs ADD_MONTHS() 중 무엇이 더 적합할까 ?

by Dddu 2025. 3. 9.

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