MySQL에서 날짜 데이터를 연도와 월만 기준으로 조회하려면 내장 함수인 YEAR()과 MONTH()를 사용하면 됩니다. 이 함수들은 각각 날짜 값에서 연도와 월을 추출해 조건 비교에 활용할 수 있습니다.
기본 문법
select *from yourTableName where YEAR(yourColumnName) = YearValue AND MONTH(yourColumnName) = monthValue;
예제 테이블 생성
문법을 실제로 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table selectDataOnYearandMonthDemo -> ( -> BookId int, -> BookName varchar(100), -> BookDueDate datetime -> ); Query OK, 0 rows affected (0.57 sec)
샘플 데이터 삽입
테이블 생성이 완료되면 테스트용 레코드를 몇 개 삽입합니다.
mysql> insert into selectDataOnYearandMonthDemo values(101,'C in Depth',date_add(now(),interval -1 year)); Query OK, 1 row affected (0.50 sec) mysql> insert into selectDataOnYearandMonthDemo values(102,'Let us C',date_add(curdate(),interval 1 year)); Query OK, 1 row affected (0.12 sec) mysql> insert into selectDataOnYearandMonthDemo values(103,'SCJP Java','2018-12-5'); Query OK, 1 row affected (0.12 sec) mysql> insert into selectDataOnYearandMonthDemo values(104,'Introduction to C++','2016-4-5'); Query OK, 1 row affected (0.24 sec)
전체 데이터 확인
삽입된 모든 레코드를 조회해 보겠습니다.
mysql> select *from selectDataOnYearandMonthDemo;
실행 결과는 다음과 같습니다.
+--------+--------------------+---------------------+ | BookId | BookName | BookDueDate | +--------+--------------------+---------------------+ | 101 | C in Depth | 2017-12-05 21:44:20 | | 102 | Let us C | 2019-12-05 00:00:00 | | 103 | SCJP Java | 2018-12-05 00:00:00 | | 104 | Introduction to C++| 2016-04-05 00:00:00 | +--------+--------------------+---------------------+ 4 rows in set (0.00 sec)
연도와 월 기준으로 조회하기
이제 YEAR()과 MONTH() 함수를 사용해 특정 연도와 월에 해당하는 데이터만 선택하는 쿼리를 작성합니다. 예를 들어 2019년 12월의 도서 반납 예정일 데이터를 조회하려면 다음과 같이 작성합니다.
mysql> select *from selectDataOnYearandMonthDemo where YEAR(BookDueDate) = 2019 AND MONTH(BookDueDate) = 12;
실행 결과는 다음과 같습니다.
+--------+----------+---------------------+ | BookId | BookName | BookDueDate | +--------+----------+---------------------+ | 102 | Let us C | 2019-12-05 00:00:00 | +--------+----------+---------------------+ 1 row in set (0.05 sec)
성능 최적화 팁
컬럼에 함수를 적용하면(WHERE YEAR(col) = ...) 인덱스를 제대로 활용하지 못해 대량의 데이터에서는 성능이 저하될 수 있습니다. 데이터 양이 많다면 아래처럼 날짜 범위 조건으로 변환하는 것이 좋습니다.
SELECT * FROM selectDataOnYearandMonthDemo WHERE BookDueDate >= '2019-12-01' AND BookDueDate < '2020-01-01';
이 방식은 컬럼 자체를 그대로 비교하므로 인덱스를 활용할 수 있어 조회 속도가 크게 향상됩니다. 소규모 데이터에서는 YEAR(), MONTH() 함수가 간편하고 직관적인 선택입니다.