MySQL에서 날짜 데이터가 저장된 컬럼에서 특정 월에 해당하는 레코드만 조회하고 싶다면 MONTH() 함수를 활용하면 됩니다. MONTH() 함수는 날짜 값에서 월에 해당하는 숫자(1~12)를 추출해 주기 때문에, WHERE 절과 함께 사용하면 원하는 월의 데이터를 손쉽게 필터링할 수 있습니다.
기본 문법
SELECT yourColumnName FROM yourTableName WHERE MONTH(yourColumnName) = yourValue;
예제 테이블 생성
문법을 실제로 이해하기 위해 사용자 로그인 시간 정보를 저장하는 테이블을 만들어 보겠습니다.
mysql> create table UserLoginTimeInformation
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserLoginDatetime datetime
-> );
Query OK, 0 rows affected (0.55 sec)샘플 데이터 입력
INSERT 명령어를 사용해 여러 개의 로그인 기록을 입력합니다.
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values(date_add(now(), interval 3 month));
Query OK, 1 row affected (0.14 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2013-05-13 13:45:34');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2013-06-11 12:41:04');
Query OK, 1 row affected (0.19 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2012-05-25 15:03:24');
Query OK, 1 row affected (0.23 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2017-05-21 12:12:40');
Query OK, 1 row affected (0.10 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2018-09-29 11:30:34');
Query OK, 1 row affected (0.10 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2016-03-10 16:40:45');
Query OK, 1 row affected (0.27 sec)전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from UserLoginTimeInformation;
실행 결과는 다음과 같습니다.
+--------+---------------------+ | UserId | UserLoginDatetime | +--------+---------------------+ | 1 | 2019-05-13 15:01:24 | | 2 | 2013-05-13 13:45:34 | | 3 | 2013-06-11 12:41:04 | | 4 | 2012-05-25 15:03:24 | | 5 | 2017-05-21 12:12:40 | | 6 | 2018-09-29 11:30:34 | | 7 | 2016-03-10 16:40:45 | +--------+---------------------+ 7 rows in set (0.00 sec)
특정 월 기준으로 레코드 조회하기
이제 MONTH() 함수를 사용해 5월에 해당하는 모든 로그인 기록을 조회하는 쿼리를 실행해 보겠습니다.
mysql> select UserLoginDatetime from UserLoginTimeInformation where MONTH(UserLoginDatetime) = 5;
실행 결과
+---------------------+ | UserLoginDatetime | +---------------------+ | 2019-05-13 15:01:24 | | 2013-05-13 13:45:34 | | 2012-05-25 15:03:24 | | 2017-05-21 12:12:40 | +---------------------+ 4 rows in set (0.00 sec)
결과를 보면 연도와 관계없이 월이 5월인 레코드만 정확하게 필터링되어 반환된 것을 확인할 수 있습니다.
성능 팁: 인덱스 활용을 위한 대안
컬럼에 함수를 적용하면 해당 컬럼에 인덱스가 있더라도 인덱스를 제대로 활용하지 못할 수 있습니다. 데이터 양이 많은 테이블이라면 아래처럼 날짜 범위 조건을 사용하는 것이 성능 면에서 더 유리합니다.
SELECT UserLoginDatetime FROM UserLoginTimeInformation WHERE UserLoginDatetime >= '2019-05-01' AND UserLoginDatetime < '2019-06-01';
이렇게 하면 인덱스 스캔이 가능해져 대용량 데이터에서도 빠른 조회 속도를 유지할 수 있습니다. 상황에 따라 MONTH() 함수 방식과 범위 조건 방식을 적절히 선택해서 사용하시기 바랍니다.