MySQL에서 현재 날짜를 기준으로 최근 며칠 전의 날짜를 구하고 싶을 때가 자주 있습니다. 예를 들어 '오늘로부터 6일 전'의 날짜가 필요하다면 DATE_ADD() 함수나 DATE_SUB() 함수를 사용하면 간단하게 해결할 수 있습니다.
기본 문법
1. DATE_ADD() 함수 사용
SELECT DATE_ADD(CURDATE(), INTERVAL -원하는일수 DAY);
2. DATE_SUB() 함수 사용
SELECT DATE_SUB(CURDATE(), INTERVAL 원하는일수 DAY);
3. 마이너스(-) 연산자 사용
SELECT CURDATE() - INTERVAL 원하는일수 DAY;
세 가지 방법 모두 동일한 결과를 반환합니다. 상황과 취향에 맞게 선택해서 사용하시면 됩니다.
실제 예제
아래는 오늘 날짜(2018-11-26 기준)로부터 6일 전인 2018-11-20을 조회하는 세 가지 방법입니다.
Case 1 — DATE_ADD() 함수 사용
음수 간격을 지정하여 과거 날짜를 구합니다.
mysql> SELECT DATE_ADD(CURDATE(), INTERVAL -6 DAY);
실행 결과:
+-------------------------------------+ | date_add(curdate(),interval -6 day) | +-------------------------------------+ | 2018-11-20 | +-------------------------------------+ 1 row in set (0.00 sec)
Case 2 — DATE_SUB() 함수 사용
양수 간격을 빼는 방식으로 과거 날짜를 구합니다.
mysql> SELECT DATE_SUB(CURDATE(), INTERVAL 6 DAY);
실행 결과:
+------------------------------------+ | date_sub(curdate(),interval 6 day) | +------------------------------------+ | 2018-11-20 | +------------------------------------+ 1 row in set (0.00 sec)
Case 3 — 마이너스(-) 기호 사용
함수 없이 간결하게 작성할 수 있는 방법입니다.
mysql> SELECT CURDATE() - INTERVAL 6 DAY;
실행 결과:
+--------------------------+ | curdate()-interval 6 day | +--------------------------+ | 2018-11-20 | +--------------------------+ 1 row in set (0.00 sec)
응용: 실무에서 자주 쓰이는 패턴
실제 업무에서는 특정 테이블에서 최근 N일간의 데이터를 조회하는 경우가 많습니다. 이때는 위 문법을 WHERE 절에 조합하면 됩니다.
-- 최근 7일간 주문 데이터 조회 SELECT * FROM orders WHERE order_date >= CURDATE() - INTERVAL 7 DAY;
또는 NOW()를 사용해 시간까지 포함한 기준으로 조회할 수도 있습니다.
-- 최근 24시간 이내 데이터 조회 SELECT * FROM logs WHERE created_at >= NOW() - INTERVAL 1 DAY;
정리
- DATE_ADD(CURDATE(), INTERVAL -N DAY) : 음수 간격으로 과거 날짜 계산
- DATE_SUB(CURDATE(), INTERVAL N DAY) : 양수 간격을 빼서 과거 날짜 계산
- CURDATE() - INTERVAL N DAY : 연산자만으로 간결하게 계산
세 가지 방법은 모두 같은 결과를 내므로, 코드 가독성과 팀 컨벤션에 맞는 방식을 선택하시면 됩니다. 시간 단위(HOUR), 월 단위(MONTH) 등 다른 INTERVAL 값도 동일한 방식으로 활용할 수 있습니다.