MySQL에서 특정 연도와 월에 해당하는 레코드를 조회하려면 YEAR() 함수와 MONTH() 함수를 사용하면 됩니다. 먼저 예제로 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName varchar(20),
CustomerTotalBill int,
PurchasingDate date
);
Query OK, 0 rows affected (0.83 sec)이제 INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('John',2000,'2019-01-21');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Chris',1000,'2019-01-31');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Robert',4500,'2018-01-01');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Sam',5500,'2017-02-12');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Carol',500,'2016-01-12');
Query OK, 1 row affected (0.17 sec)SELECT 문을 실행하여 테이블에 저장된 전체 레코드를 확인합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------+--------------+-------------------+----------------+ | CustomerId | CustomerName | CustomerTotalBill | PurchasingDate | +------------+--------------+-------------------+----------------+ | 1 | John | 2000 | 2019-01-21 | | 2 | Chris | 1000 | 2019-01-31 | | 3 | Robert | 4500 | 2018-01-01 | | 4 | Sam | 5500 | 2017-02-12 | | 5 | Carol | 500 | 2016-01-12 | +------------+--------------+-------------------+----------------+ 5 rows in set (0.00 sec)
특정 연도와 월의 레코드 조회하기
다음은 MySQL에서 특정 연도와 월에 해당하는 레코드만 조회하는 쿼리입니다. WHERE 절에서 YEAR() 함수로 연도를, MONTH() 함수로 월을 각각 비교합니다.
mysql> select *from DemoTable WHERE YEAR(DATE(PurchasingDate))=2019 AND MONTH(DATE(PurchasingDate)) = 01;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------------+----------------+ | CustomerId | CustomerName | CustomerTotalBill | PurchasingDate | +------------+--------------+-------------------+----------------+ | 1 | John | 2000 | 2019-01-21 | | 2 | Chris | 1000 | 2019-01-31 | +------------+--------------+-------------------+----------------+ 2 rows in set (0.03 sec)
결과를 보면 구매일(PurchasingDate)이 2019년 1월인 John과 Chris의 레코드만 정확하게 필터링되어 반환된 것을 확인할 수 있습니다.
성능 최적화 팁
YEAR(), MONTH()처럼 컬럼에 함수를 적용하면 해당 컬럼에 인덱스가 있더라도 인덱스를 활용할 수 없어, 데이터가 많은 테이블에서는 조회 속도가 느려질 수 있습니다. 이 경우 아래와 같이 날짜 범위 조건을 사용하는 것이 더 효율적입니다.
mysql> select *from DemoTable WHERE PurchasingDate >= '2019-01-01' AND PurchasingDate < '2019-02-01';
두 방식 모두 동일한 결과를 반환하지만, 범위 조건 방식은 인덱스 스캔이 가능하므로 대용량 데이터 환경에서 권장됩니다.