오라클에서 날짜와 시간을 더하거나 빼는 작업은 생각보다 자주 마주칩니다. 특히 월말이나 연말 배치 작업을 하다 보면 "이번 달 말일은 어떻게 구하지?", "어제 오전 9시부터 지금까지 몇 시간이 지났지?" 같은 궁금증이 생기기 마련입니다. 결론부터 말하면, 오라클은 DATE 타입 연산에서 숫자 1이 하루를 의미하고, INTERVAL 키워드로 시·분·초 단위까지 명확하게 제어할 수 있습니다. 월 단위 계산은 ADD_MONTHS, 두 시점의 개월 차이는 MONTHS_BETWEEN을 쓰는 것이 정석이며, 이 다섯 가지를 조합하면 대부분의 날짜 계산이 3초 안에 해결됩니다.
오라클 날짜 더하기 빼기, +와 -만 알아도 절반은 끝난다
오라클 SQL에서 가장 기본적인 날짜 연산은 SYSDATE + 1처럼 정수를 더하거나 빼는 방식입니다. 이때 1은 하루를 뜻하기 때문에, SYSDATE + 1은 내일 같은 시각, SYSDATE - 1은 어제 같은 시각이 됩니다. 일(day) 단위로만 계산한다면 이 방식이 가장 빠르고 직관적입니다.
-- 내일, 어제, 7일 후
SELECT SYSDATE + 1 AS 내일,
SYSDATE - 1 AS 어제,
SYSDATE + 7 AS 일주일후
FROM DUAL;
주의할 점은 오라클의 DATE 타입에 시간 정보가 기본적으로 포함되어 있다는 사실입니다. SYSDATE + 1은 정확히 24시간 후를 가리키므로, "오늘 자정부터 내일 자정까지" 같은 범위를 구할 때는 TRUNC(SYSDATE)로 시간을 잘라낸 뒤 연산하는 편이 안전합니다. 날짜만 필요하고 시간은 무시해도 되는 상황이라면 TRUNC를 함께 쓰는 습관을 들이는 게 좋습니다.
시·분·초 단위 연산, INTERVAL이 답이다
숫자 연산으로는 시간 단위를 다루기 어렵습니다. SYSDATE + 1/24라고 쓰면 1시간을 더할 수는 있지만, 코드를 읽는 사람 입장에서는 "이게 몇 시간을 더하는 거지?" 하고 헷갈리기 쉽습니다. 이런 경우 INTERVAL 키워드를 사용하면 단위가 명확하게 드러나서 가독성과 유지보수 측면에서 훨씬 유리합니다.
-- 2시간 후, 30분 전, 10초 후
SELECT SYSDATE + INTERVAL '2' HOUR AS 두시간후,
SYSDATE - INTERVAL '30' MINUTE AS 삼십분전,
SYSDATE + INTERVAL '10' SECOND AS 십초후
FROM DUAL;
INTERVAL은 일·시·분·초를 조합해서도 쓸 수 있습니다. 예를 들어 INTERVAL '3 10' DAY TO HOUR는 3일 10시간을 의미하고, INTERVAL '90' MINUTE는 90분을 뜻합니다. 복합 단위가 필요한 배치 작업, 예를 들어 "3일 10시간 뒤에 실행할 로그를 찾아라" 같은 쿼리에서 유용하게 쓰입니다. 다만 INTERVAL은 월(Month)이나 연(Year) 단위를 지원하지 않는다는 점을 기억해야 합니다. 월마다 일수가 다르고 윤년이 있어서 고정된 길이로 표현할 수 없기 때문입니다.
월 단위 계산은 ADD_MONTHS, 두 날짜 사이 개월 수는 MONTHS_BETWEEN
월을 더하거나 빼야 할 때는 산술 연산자 대신 ADD_MONTHS 함수를 사용합니다. 이 함수는 월말이나 윤년 같은 복잡한 케이스를 자동으로 보정해 줍니다. 예를 들어 1월 31일에 ADD_MONTHS(날짜, 1)을 적용하면 2월 28일(윤년이면 29일)로 계산됩니다.
-- 3개월 후, 6개월 전
SELECT ADD_MONTHS(SYSDATE, 3) AS 석달후,
ADD_MONTHS(SYSDATE, -6) AS 여섯달전
FROM DUAL;
두 날짜 사이의 개월 수가 필요할 때는 MONTHS_BETWEEN 함수를 씁니다. 근속 개월 수나 나이를 개월 단위로 계산할 때 자주 활용되며, 함수의 첫 번째 인자에서 두 번째 인자를 뺀 값이 반환됩니다. 결과가 소수점으로 나오면 일수 차이까지 반영된 것이므로, 정수 개월만 필요하다면 TRUNC나 ROUND로 감싸서 사용하면 됩니다.
-- 두 날짜 사이 개월 수
SELECT MONTHS_BETWEEN(TO_DATE('2026-08-21', 'YYYY-MM-DD'),
TO_DATE('2026-01-15', 'YYYY-MM-DD')) AS 개월차
FROM DUAL;
실무에서 두 날짜 차이 계산할 때 주의할 점
두 날짜를 뺄셈하면 결과는 일수(days)로 나옵니다. 그런데 시간 정보가 포함된 DATE 타입끼리 빼면 소수점이 붙은 값이 반환될 수 있습니다. 예를 들어 오늘 오전 9시와 어제 오후 6시의 차이를 구하면 0.625 같은 값이 나옵니다. 이 값은 15시간을 일수로 환산한 것입니다.
- 날짜 차이를 정수 일수로만 구하려면:
TRUNC(날짜2) - TRUNC(날짜1)처럼 양쪽을 잘라낸 뒤 연산 - 시간 차이를 시 단위로 구하려면:
(날짜2 - 날짜1) * 24 - 분 단위로 구하려면:
(날짜2 - 날짜1) * 24 * 60
또 하나 기억해 둘 점은 두 날짜를 뺄 때 순서입니다. MONTHS_BETWEEN(A, B)는 A에서 B를 뺀 개월 수를 반환하므로, B가 미래 날짜면 음수가 나옵니다. 쿼리를 작성할 때 인자 순서를 바꿔 쓰면 부호가 반대로 바뀌는 실수를 하기 쉽습니다.
마지막으로 정리하면, 이렇게 쓰면 됩니다
오라클 날짜 연산에서 기억할 핵심은 세 가지로 요약됩니다. 첫째, 일 단위는 +와 -로 처리한다. 둘째, 시·분·초 단위는 INTERVAL로 명시한다. 셋째, 월 단위는 ADD_MONTHS로 더하고 빼고, MONTHS_BETWEEN으로 차이를 구한다. 이 다섯 가지 도구를 상황에 맞게 조합하면 대부분의 날짜 계산 문제가 3초 안에 해결됩니다.
실제 업무에서 배치 스케줄이나 정산 로직을 짤 때는 단순히 함수만 외우는 것보다 "이 연산의 결과가 어떤 타입으로 나오는지"를 확인하는 습관이 더 중요합니다. DATE 타입의 기본 포맷이 'RR/MM/DD'로 표시된다고 해서 시간 정보가 없다고 착각하기 쉽기 때문입니다. 쿼리 작성 후에는 TO_CHAR(결과값, 'YYYY-MM-DD HH24:MI:SS')로 변환해서 실제 값이 의도한 대로 나왔는지 한 번씩 확인해 보는 것을 권장합니다.