개요
MySQL에서 특정 기간 이전의 데이터만 조회해야 하는 경우가 자주 있습니다. 예를 들어 오래된 로그를 정리하거나, 일정 기간이 지난 게시글을 필터링할 때 유용합니다. 이 글에서는 NOW() 함수와 DATE_SUB() 함수를 조합하여 타임스탬프가 15일보다 오래된 레코드만 가져오는 방법을 예제와 함께 살펴보겠습니다.
1단계: 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다. 날짜 정보를 저장할 datetime 타입의 컬럼 하나로 구성된 간단한 테이블입니다.
mysql> create table DemoTable
-> (
-> ArrivalDate datetime
-> );
Query OK, 0 rows affected (0.91 sec)
2단계: 샘플 데이터 삽입하기
INSERT 명령어로 여러 개의 레코드를 추가합니다. 현재 날짜가 2019-07-03이라고 가정하겠습니다.
mysql> insert into DemoTable values('2019-07-03');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-06-20');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-06-15');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2018-06-11');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2018-06-01');
Query OK, 1 row affected (0.17 sec)3단계: 전체 레코드 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------+
| ArrivalDate |
+---------------------+
| 2019-07-03 00:00:00 |
| 2019-06-20 00:00:00 |
| 2019-06-15 00:00:00 |
| 2018-06-11 00:00:00 |
| 2018-06-01 00:00:00 |
+---------------------+
5 rows in set (0.00 sec)
4단계: 15일 이전 레코드 조회 쿼리 실행하기
타임스탬프가 15일보다 오래된 레코드만 가져오려면 아래와 같이 쿼리를 작성합니다.
mysql> select *from DemoTable where ArrivalDate < date_sub(now(), interval 15 day) order by ArrivalDate DESC;
핵심 함수 설명
- NOW(): 현재 날짜와 시간을 반환합니다.
- DATE_SUB(날짜, INTERVAL n DAY): 지정한 날짜에서 n일을 뺀 값을 반환합니다.
즉, date_sub(now(), interval 15 day)는 현재 시점에서 정확히 15일 전의 시각을 계산하고, WHERE 절의 비교 연산자(<)를 통해 그보다 이전 날짜인 레코드만 필터링합니다. 마지막의 ORDER BY ArrivalDate DESC는 결과를 최신 날짜순으로 내림차순 정렬해 줍니다.
실행 결과
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+---------------------+
| ArrivalDate |
+---------------------+
| 2019-06-15 00:00:00 |
| 2018-06-11 00:00:00 |
| 2018-06-01 00:00:00 |
+---------------------+
3 rows in set (0.00 sec)
현재 날짜(2019-07-03) 기준으로 15일 전은 2019-06-18입니다. 따라서 그보다 이전 날짜인 2019-06-15, 2018-06-11, 2018-06-01 세 건만 조회되었고, 15일 이내인 2019-06-20과 당일 데이터인 2019-07-03은 제외된 것을 확인할 수 있습니다.
마무리
이처럼 DATE_SUB(NOW(), INTERVAL n DAY) 패턴을 활용하면 원하는 기간 이전의 데이터를 손쉽게 조회할 수 있습니다. 숫자와 단위(DAY, MONTH, YEAR 등)만 바꾸면 월 단위, 연 단위 필터링도 동일한 방식으로 적용할 수 있으니 실무에서 다양하게 응용해 보시기 바랍니다.