MySQL에서 날짜 데이터가 저장된 테이블에서 특정 연도에 해당하는 레코드만 조회하고 싶을 때가 있습니다. 이럴 때는 YEAR() 함수를 활용하면 간단하게 해결할 수 있습니다.
기본 문법
연도별로 레코드를 가져오려면 WHERE 절에서 YEAR() 함수를 다음과 같이 사용합니다.
SELECT * FROM yourTableName
WHERE YEAR(yourColumnName) = yourYearValue;
예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE DemoTable
-> (
-> CustomerName varchar(100),
-> ShippingDate datetime
-> );
Query OK, 0 rows affected (0.64 sec)
데이터 삽입
INSERT 명령어를 사용해 몇 개의 샘플 레코드를 추가합니다.
mysql> INSERT INTO DemoTable VALUES('Chris','2019-01-21');
Query OK, 1 row affected (0.28 sec)
mysql> INSERT INTO DemoTable VALUES('Robert','2018-02-21');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable VALUES('David','2016-04-01');
Query OK, 1 row affected (0.17 sec)전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM DemoTable;
위 쿼리는 아래와 같은 결과를 출력합니다.
+--------------+---------------------+
| CustomerName | ShippingDate |
+--------------+---------------------+
| Chris | 2019-01-21 00:00:00 |
| Robert | 2018-02-21 00:00:00 |
| David | 2016-04-01 00:00:00 |
+--------------+---------------------+
3 rows in set (0.00 sec)
특정 연도로 레코드 조회하기
이제 YEAR() 함수를 사용해 배송일(ShippingDate)이 2016년인 레코드만 조회하는 쿼리를 실행해 보겠습니다.
mysql> SELECT * FROM DemoTable
-> WHERE YEAR(ShippingDate) = 2016;
실행 결과는 다음과 같습니다.
+--------------+---------------------+
| CustomerName | ShippingDate |
+--------------+---------------------+
| David | 2016-04-01 00:00:00 |
+--------------+---------------------+
1 row in set (0.04 sec)
결과를 보면 ShippingDate가 2016년인 David의 레코드 하나만 정확히 반환된 것을 확인할 수 있습니다.
성능 팁
참고로, 데이터 양이 많은 대용량 테이블에서는 WHERE 절에 함수를 적용하면 인덱스를 제대로 활용하지 못할 수 있습니다. 이 경우 아래처럼 범위 조건으로 작성하면 성능을 개선할 수 있습니다.
SELECT * FROM DemoTable
WHERE ShippingDate >= '2016-01-01'
AND ShippingDate < '2017-01-01';
이 방식은 ShippingDate 컬럼에 인덱스가 있다면 해당 인덱스를 그대로 활용할 수 있어 더 빠른 조회가 가능합니다.