MySQL에서 MONTH() 함수를 사용하면 날짜 데이터를 특정 월을 기준으로 손쉽게 조회할 수 있습니다. 이 글에서는 예제 테이블을 만들고, MONTH() 함수를 활용해 원하는 월의 데이터만 추출하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 사용자 게시글 정보를 저장할 테이블을 생성합니다. 테이블에는 아이디, 사용자 이름, 게시일, 좋아요 수 컬럼이 포함됩니다.
mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> UserName varchar(10), -> UserPostMessageDate datetime, -> UserLikes int -> ); Query OK, 0 rows affected (0.77 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 추가합니다. 각 사용자는 서로 다른 날짜에 게시글을 작성한 것으로 설정했습니다.
mysql> insert into DemoTable(UserName,UserPostMessageDate,UserLikes)
values('John','2019-01-31',4560);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(UserName,UserPostMessageDate,UserLikes)
values('Sam','2019-06-28',790);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable(UserName,UserPostMessageDate,UserLikes)
values('Carol','2019-05-01',230);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(UserName,UserPostMessageDate,UserLikes)
values('David','2019-03-05',10000000);
Query OK, 1 row affected (0.33 sec)3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+----+----------+---------------------+-----------+ | Id | UserName | UserPostMessageDate | UserLikes | +----+----------+---------------------+-----------+ | 1 | John | 2019-01-31 00:00:00 | 4560 | | 2 | Sam | 2019-06-28 00:00:00 | 790 | | 3 | Carol | 2019-05-01 00:00:00 | 230 | | 4 | David | 2019-03-05 00:00:00 | 10000000 | +----+----------+---------------------+-----------+ 4 rows in set (0.00 sec)
4. MONTH() 함수로 특정 월 데이터 조회하기
이제 핵심인 MONTH() 함수를 사용해 보겠습니다. WHERE 절에서 MONTH() 함수에 datetime 컬럼을 넘기면 해당 날짜의 월(1~12)이 반환되며, 이 값을 조건으로 비교하면 됩니다.
예를 들어 6월에 작성된 게시글만 조회하려면 다음과 같이 쿼리를 작성합니다.
mysql> select Id,UserName,UserLikes from DemoTable where MONTH(UserPostMessageDate)=6;
실행 결과는 다음과 같습니다.
+----+----------+-----------+ | Id | UserName | UserLikes | +----+----------+-----------+ | 2 | Sam | 790 | +----+----------+-----------+ 1 row in set (0.00 sec)
게시일이 6월인 'Sam'의 레코드만 정확히 조회된 것을 확인할 수 있습니다.
참고 사항
MONTH() 함수 대신 DATE_FORMAT() 함수를 사용해 WHERE DATE_FORMAT(UserPostMessageDate, '%m') = '06'과 같이 조건을 걸 수도 있습니다. 또한 연도까지 함께 필터링하고 싶다면 YEAR(UserPostMessageDate)=2019 AND MONTH(UserPostMessageDate)=6처럼 YEAR() 함수와 조합하면 됩니다.
다만 이런 방식은 컬럼에 함수를 적용하기 때문에 인덱스를 활용하지 못할 수 있다는 점에 유의하세요. 대량의 데이터를 다룰 때는 UserPostMessageDate >= '2019-06-01' AND UserPostMessageDate < '2019-07-01'과 같이 범위 조건을 사용하는 것이 성능 면에서 더 유리합니다.