TECH/sql

SQL 날짜 더하기/빼기(INTERVAL) - 더 이상 구글링 필요 없는 DB별 문법 총정리

런코리치 2026. 2. 25. 13:00

데이터베이스 실무에서 SQL 작성 시 가장 까다로운 부분 중 하나가 바로 날짜(Date/Time) 처리입니다. DBMS마다 함수명이 제각각이고 포맷 방식도 다르기 때문이죠. 특히 프로젝트 환경이 바뀌면 가장 먼저 구글링을 하게 되는 영역이기도 합니다.

오늘은 실무에서 가장 빈번하게 사용되는 날짜 포맷 변환, 날짜 계산, 현재 시간 조회 방법을 3대 DBMS별로 완벽하게 정리해 보겠습니다. 특히 PostgreSQL의 강력한 interval 기능까지 상세히 다뤄보겠습니다.


1. 현재 날짜 및 시간 조회

가장 기본이 되는 현재 시간 조회 방법입니다.

DBMS 함수 및 문법 특징
Oracle SYSDATE, SYSTIMESTAMP SYSDATE는 초 단위까지, SYSTIMESTAMP는 밀리초까지 제공
MySQL NOW(), CURDATE(), CURTIME() 날짜+시간, 날짜만, 시간만 각각 조회가 편리함
PostgreSQL NOW(), CURRENT_TIMESTAMP 타임존 정보를 포함한 정밀한 시간 제공

1. 12시간제(HH) vs 24시간제(HH24)의 대참사

가장 흔하지만 치명적인 실수입니다. 오후 1시를 데이터베이스에 입력하거나 조회할 때 형식을 잘못 지정하면 데이터가 꼬이게 됩니다.

  • 문제 상황: 오후 1시(13:00)를 YYYY-MM-DD HH:MI:SS로 포맷팅하면?
    • 결과: 2026-03-21 01:00:00 (새벽 1시인지 오후 1시인지 구분 불가!)
  • 해결책: 24시간 형식을 기본으로 사용하세요.
    • Oracle/PostgreSQL: HH24 사용 (예: YYYY-MM-DD HH24:MI:SS)
    • MySQL: %H 사용 (예: %Y-%m-%d %H:%i:%s) / %h는 12시간제입니다.

2. '분'과 '월'의 혼동 (MM vs MI)

자바나 다른 언어의 영향으로 SQL에서도 월을 mm으로 쓰는 경우가 많습니다. 하지만 SQL(특히 Oracle)에서 MM은 Month, MI는 Minute입니다.

  • 실수 예시: YYYY-MM-DD HH24:MM:SS
    • 결과: 시간이 출력되어야 할 자리에 **'월'**이 다시 출력됩니다. (예: 13시 03분인데 13시 03월로 표시)
  • 기억하세요: 분은 MI(Minute)입니다!

3. 날짜 연산 시 '데이터 타입' 주의

단순히 날짜 + 1을 할 때, 해당 컬럼의 데이터 타입이 DATE인지 TIMESTAMP인지, 혹은 STRING인지에 따라 결과가 완전히 달라질 수 있습니다.

  • Tip: 안전한 연산을 위해 가급적 명시적 형변환(TO_DATE, STR_TO_DATE 등)이나 INTERVAL 키워드를 사용하는 습관을 들이는 것이 좋습니다.

2. 날짜 포맷 변환 (날짜 → 문자열)

데이터를 사용자에게 보여줄 때 가장 많이 사용하는 기능입니다.

① Oracle: TO_CHAR

오라클은 포맷 마스크를 사용하여 매우 유연하게 변환합니다.

  • SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
  • 주의: 월은 MM, 분은 MI입니다. 이를 혼동하면 엉뚱한 시간이 출력됩니다.

② MySQL: DATE_FORMAT

MySQL은 % 기호를 사용하여 포맷을 지정합니다.

  • SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
  • %Y는 4자리 연도, %m은 2자리 월, %i는 분을 의미합니다.

③ PostgreSQL: TO_CHAR

오라클과 문법이 거의 동일하여 마이그레이션이 매우 쉽습니다.

  • SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS');

3. 날짜 차이 계산과 PostgreSQL의 interval

두 날짜 사이의 간격을 구하는 방식은 DBMS마다 차이가 큽니다.

① Oracle

오라클은 날짜끼리 단순히 빼기(-) 연산을 하면 일(Day) 차이가 나옵니다.

  • SELECT SYSDATE - TO_DATE('2026-01-01', 'YYYY-MM-DD') FROM DUAL;

② MySQL

전용 함수인 DATEDIFF와 TIMESTAMPDIFF를 사용합니다.

  • DATEDIFF(날짜1, 날짜2): 일수 차이를 반환합니다.
  • TIMESTAMPDIFF(MONTH, '2026-01-01', NOW()): 개월 수, 시간, 분 등 단위 지정이 가능합니다.

③ PostgreSQL: AGE와 interval (심화)

PostgreSQL은 '시간의 간격'을 의미하는 interval 타입을 활용해 매우 강력한 연산을 제공합니다.

  • AGE 함수: 사람이 읽기 편한 '나이' 혹은 '기간' 형태로 결과를 반환합니다.
  • SQL
    -- 결과: 11 mons 29 days 00:00:00
    SELECT AGE(TIMESTAMP '2026-12-31', TIMESTAMP '2026-01-01');
    
  • interval 연산: 단순 뺄셈 연산 시 interval 객체가 반환되어 더 세밀한 분석이 가능합니다.
  • SQL
    -- 1. 두 날짜 사이의 순수한 시간 차이 (결과: 364 days)
    SELECT TIMESTAMP '2026-12-31' - TIMESTAMP '2026-01-01';
    
    -- 2. 시간 단위 추출 (EXTRACT 조합)
    -- 결과: 5 (5시간 차이)
    SELECT EXTRACT(HOUR FROM (TIMESTAMP '2026-02-24 15:30:00' - TIMESTAMP '2026-02-24 10:00:00'));
    

4. 날짜 더하기/빼기 (Interval 활용)

특정 날짜로부터 7일 전, 혹은 1개월 후를 구하는 실무 예제입니다.

  • Oracle: SYSDATE + 7 (7일 더하기), ADD_MONTHS(SYSDATE, 1) (1개월 더하기)
  • MySQL: DATE_ADD(NOW(), INTERVAL 1 MONTH)
  • PostgreSQL (가장 직관적):
  • SQL
    -- 1. 현재 시간에서 2시간 30분 전 조회
    SELECT NOW() - INTERVAL '2 hours 30 minutes';
    
    -- 2. 1년 2개월 15일 뒤의 날짜 조회 (복합 단위)
    SELECT NOW() + INTERVAL '1 year 2 months 15 days';
    

💡 실무 적용 팁: 만료일 계산

SQL
-- 유료 멤버십 만료일이 3일 이내로 남은 사용자 조회
SELECT user_id 
FROM memberships 
WHERE expire_date <= NOW() + INTERVAL '3 days';

5. 문자열을 날짜로 변환 (TO_DATE)

사용자로부터 입력받은 문자열("20260224")을 날짜 타입으로 바꿔야 연산이 가능합니다.

  • Oracle: TO_DATE('20260224', 'YYYYMMDD')
  • MySQL: STR_TO_DATE('20260224', '%Y%m%d')
  • PostgreSQL: TO_DATE('20260224', 'YYYYMMDD') 또는 '2026-02-24'::date (캐스팅)

🏁 마무리하며: "어떤 방식을 권장하나?"

  1. 가독성과 유연성: PostgreSQL의 INTERVAL 방식이 마치 영어 문장을 읽듯 직관적이어서 가장 권장됩니다.
  2. 표준성: 여러 DB를 옮겨 다녀야 한다면 COALESCE나 CASE WHEN과 함께 표준적인 날짜 포맷을 유지하는 것이 중요합니다.
  3. 성능 주의: WHERE 절에서 날짜 컬럼을 함수로 감싸면(WHERE TO_CHAR(reg_date, 'YYYY') = '2026') 인덱스를 타지 못합니다. 가급적 컬럼은 그대로 두고 비교 대상 값을 변환하여 조회하세요.

이 가이드가 여러분의 쿼리 작성을 더 빠르고 정확하게 만들어 주길 바랍니다!

시간을 데이터로 다루는 것은 투자에서 복리(Compounding) 계산을 하는 것과 같습니다. 시간이 흐를수록 데이터의 가치가 쌓이듯, 정확한 날짜 연산을 통해 여러분의 시스템 데이터도 가치 있게 관리해 보세요. 시간을 지배하는 개발자가 자산도 지배하는 법입니다.