YEAR(), MONTH(), CURDATE(), DATE_SUB()를 조합하면 상대적 월 범위 쿼리를 작성할 수 있습니다.
테이블 생성 및 데이터 삽입
mysql> CREATE TABLE DemoTable1795 (
-> Name VARCHAR(20),
-> DueDate DATE
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO DemoTable1795 VALUES('John','2018-07-21');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1795 VALUES('Sam','2019-10-21');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1795 VALUES('Sam','2019-01-10');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1795 VALUES('Mike','2018-12-31');
Query OK, 1 row affected (0.00 sec)
데이터 조회
mysql> SELECT * FROM DemoTable1795;
+------+------------+ | Name | DueDate | +------+------------+ | John | 2018-07-21 | | Sam | 2019-10-21 | | Sam | 2019-01-10 | | Mike | 2018-12-31 | +------+------------+ 4 rows in set (0.00 sec)
작년 7월 ~ 올해 7월 범위 조회 (현재 2019-11-29 기준)
mysql> SELECT * FROM DemoTable1795
-> WHERE (YEAR(DueDate) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
-> AND MONTH(DueDate) BETWEEN 7 AND 12)
-> OR (YEAR(DueDate) = YEAR(CURDATE())
-> AND MONTH(DueDate) BETWEEN 1 AND 7);
+------+------------+ | Name | DueDate | +------+------------+ | John | 2018-07-21 | | Sam | 2019-01-10 | | Mike | 2018-12-31 | +------+------------+ 3 rows in set (0.00 sec)
간소화 팁: WHERE DueDate >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND DueDate <= CURDATE()처럼 날짜 직접 비교가 더 직관적이고 인덱스 활용에도 유리합니다. 함수 연산(YEAR(), MONTH())은 인덱스를 못 타게 할 수 있습니다.