Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 연도와 월 기준으로 데이터를 조회하는 방법 (YEAR, MONTH 함수 활용)

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() 함수가 간편하고 직관적인 선택입니다.