본문 바로가기
SQL/Oracle

오라클 날짜 더하는 방법 빼는 방법 정리

by wakestand 2020. 12. 8.
반응형

오라클에서 날짜를 계산하는 방법은

ADD_MONTHS, +로 값을 넣어주는 방법과

INTERVAL을 이용한 방법이 있는데

 

일단 안좋은 방법인

ADD_MONTHS, +를 이용한 방법을 보자면

sysdate가 아닐 경우 TO_DATE로 date 타입으로 만들어준 뒤

ADD_MONTH(값, 1)을 하면 1달을 더하게 되고

12를 입력해주면 1년을 더하게 된다

반대로 빼려면 +만 -로 바꿔주면 된다

 

다음으로 일, 시간, 분, 초는 +-로 추가해야 하는데

1은 1일 1/24는 1시간 1/1440은 1분 1/86400은 1초가 되겠다

근데 딱 보면 알겠지만

이런 식으로 하면 불편하다..

 

반면 INTERVAL을 사용하면

날짜 덧셈 뺄셈을 훨씬 편하게 할 수 있는데

값 + INTERVAL '값' 년/월/일/시/분/초

만 입력해주면 끝이고 해당하는 값은 아래와 같다

 

년 - YEAR

월 - MONTH 

일 - DAY

시 - HOUR

분 - MINUTE

초 - SECOND

 

그리고 년부터 월까지 / 일부터 초까지

한번에 덧셈 뺄셈이 가능한데

 

INTERVAL '년-월' YEAR TO MONTH

INTERVAL '일 시:분:초' DAY TO SECOND

를 사용해주면 된다

 

날짜 계산 시에는

INTERVAL을 이용한 방법이 엄청나게 편하기 때문에

이 방법을 사용하는 것을 권장한다

 

마지막으로 예제에 사용한 쿼리는 아래와 같다

 

-- 오라클 날짜 더하기 빼기
WITH TBL AS (
  SELECT '2011-11-11 10:00:00' AS DT FROM DUAL
)

SELECT TO_CHAR(ADD_MONTHS(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS'), 12), 'YYYY-MM-DD') YR -- 년
       , TO_CHAR(ADD_MONTHS(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS'), 1), 'YYYY-MM-DD') MON -- 월
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + 1, 'YYYY-MM-DD') AS DAY -- 일
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + 1/24, 'HH24:MI:SS') AS HR -- 시간
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + 1/1440, 'HH24:MI:SS') AS MIN -- 분
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + 1/86400, 'HH24:MI:SS') AS SEC -- 초
  FROM TBL
;

 

-- 오라클 INTERVAL을 이용한 날짜 더하기 빼기
WITH TBL AS (
  SELECT '2011-11-11 10:00:00' AS DT FROM DUAL
)

SELECT TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' YEAR, 'YYYY-MM-DD') AS YR
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' MONTH, 'YYYY-MM-DD') AS MON
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' DAY, 'YYYY-MM-DD') AS DAY
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' HOUR, 'HH24:MI:SS') AS HR
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' MINUTE, 'HH24:MI:SS') AS MIN
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' SECOND, 'HH24:MI:SS') AS SEC
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1 01:01:01' DAY TO SECOND
                 , 'YYYY-MM-DD HH24:MI:SS') AS DAY_TO_SECOND
       , TO_CHAR(TO_DATE(DT, 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '89-3' YEAR TO MONTH
                 , 'YYYY-MM-DD') AS YEAR_TO_MONTH	   
  FROM TBL
;
반응형

댓글