MySQL에서 특정 시점을 기준으로 앞뒤 30일 이내의 날짜 데이터를 조회하려면 INTERVAL을 활용한 산술 연산을 사용하면 됩니다. NOW() 함수에서 30일을 빼고 더하는 방식으로 간단하게 구현할 수 있습니다.
기본 문법
30일 범위의 날짜를 선택하는 기본 문법은 다음과 같습니다.
select * from yourTableName
where yourDateColumnName > NOW() - INTERVAL 30 DAY
and yourDateColumnName < NOW() + INTERVAL 30 DAY;
예제 테이블 생성
실제 동작을 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table selectDatesDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ArrivalDate datetime
-> );
Query OK, 0 rows affected (0.77 sec)
샘플 데이터 삽입
insert 명령어를 사용해 테이블에 여러 개의 레코드를 삽입합니다.
mysql> insert into selectDatesDemo(ArrivalDate) values('2019-01-10');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectDatesDemo(ArrivalDate) values('2019-01-29');
Query OK, 1 row affected (0.21 sec)
mysql> insert into selectDatesDemo(ArrivalDate) values('2019-02-13');
Query OK, 1 row affected (0.14 sec)
mysql> insert into selectDatesDemo(ArrivalDate) values('2019-02-19');
Query OK, 1 row affected (0.14 sec)
mysql> insert into selectDatesDemo(ArrivalDate) values('2018-02-13');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDatesDemo(ArrivalDate) values('2018-03-13');
Query OK, 1 row affected (0.19 sec)전체 데이터 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from selectDatesDemo;
실행 결과는 다음과 같습니다.
+----+---------------------+
| Id | ArrivalDate |
+----+---------------------+
| 1 | 2019-01-10 00:00:00 |
| 2 | 2019-01-29 00:00:00 |
| 3 | 2019-02-13 00:00:00 |
| 4 | 2019-02-19 00:00:00 |
| 5 | 2018-02-13 00:00:00 |
| 6 | 2018-03-13 00:00:00 |
+----+---------------------+
6 rows in set (0.00 sec)
30일 범위 날짜 조회 쿼리 실행
이제 현재 날짜를 기준으로 앞뒤 30일 이내에 해당하는 레코드만 조회하는 쿼리를 실행해 보겠습니다.
mysql> select * from selectDatesDemo
-> where ArrivalDate > NOW() - INTERVAL 30 DAY
-> and ArrivalDate < NOW() + INTERVAL 30 DAY;
실행 결과는 다음과 같습니다.
+----+---------------------+
| Id | ArrivalDate |
+----+---------------------+
| 3 | 2019-02-13 00:00:00 |
| 4 | 2019-02-19 00:00:00 |
+----+---------------------+
2 rows in set (0.04 sec)
위 출력 결과를 보면 현재 시점(2019년 2월 중순경)을 기준으로 앞뒤 30일 이내에 있는 두 개의 레코드만 반환된 것을 확인할 수 있습니다. 이처럼 NOW() 함수와 INTERVAL을 조합하면 별도의 복잡한 계산 없이도 원하는 날짜 범위의 데이터를 손쉽게 필터링할 수 있습니다. 참고로 정확히 30일이 아니라 한 달 단위로 조회하고 싶다면 INTERVAL 1 MONTH를 사용하는 것도 가능합니다.