MySQL에서 날짜 데이터가 저장된 테이블에서 특정 월과 연도에 해당하는 레코드만 조회하고 싶다면 MONTH() 함수와 YEAR() 함수를 함께 사용하면 됩니다. 이 두 함수는 각각 DATE 타입 값에서 월과 연도를 숫자로 추출해 주기 때문에 WHERE 절에서 조건 비교에 활용하기 매우 편리합니다.
1. 예제 테이블 생성
먼저 구매 날짜(PurchaseDate)를 저장할 테이블을 생성합니다.
mysql> create table DemoTable1846
(
PurchaseDate date
);
Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용하여 여러 날짜의 레코드를 추가합니다.
mysql> insert into DemoTable1846 values('2019-01-10');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1846 values('2019-12-24');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1846 values('2018-09-21');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1846 values('2017-10-26');
Query OK, 1 row affected (0.00 sec)3. 전체 레코드 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1846;
실행 결과는 다음과 같습니다.
+--------------+
| PurchaseDate |
+--------------+
| 2019-01-10 |
| 2019-12-24 |
| 2018-09-21 |
| 2017-10-26 |
+--------------+
4 rows in set (0.00 sec)
4. 특정 월과 연도로 레코드 조회하기
이제 핵심 쿼리입니다. 아래처럼 MONTH() 함수로 월을, YEAR() 함수로 연도를 추출한 뒤 WHERE 절에서 원하는 값과 비교하면 해당 조건에 맞는 레코드만 가져올 수 있습니다.
mysql> select * from DemoTable1846
where month(PurchaseDate)=12
and year(PurchaseDate)=2019;
위 쿼리는 2019년 12월에 해당하는 레코드만 반환하며, 실행 결과는 다음과 같습니다.
+--------------+
| PurchaseDate |
+--------------+
| 2019-12-24 |
+--------------+
1 row in set (0.00 sec)
참고 사항
MONTH()는 1~12 사이의 정수를, YEAR()는 네 자리 연도 값을 반환합니다. 다만 대용량 테이블에서 이 방식은 인덱스를 활용하지 못할 수 있으므로, 성능이 중요한 경우에는 PurchaseDate >= '2019-12-01' AND PurchaseDate < '2020-01-01'처럼 범위 조건을 사용하는 것이 좋습니다.