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

MySQL에서 특정 월을 기준으로 테이블의 레코드를 조회하는 방법

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() 함수 방식과 범위 조건 방식을 적절히 선택해서 사용하시기 바랍니다.