MySQL에서 날짜 데이터를 월(month)과 연도(year) 단위로 그룹화하려면 DATE_FORMAT() 함수와 GROUP BY 절을 함께 사용하면 됩니다. 이 조합은 매출 집계, 통계 리포트 등 날짜별 데이터를 정리할 때 매우 유용하게 활용됩니다.
기본 문법
월과 연도를 그룹화하는 기본적인 쿼리 구조는 다음과 같습니다.
SELECT DATE_FORMAT(yourColumnName, '%m-%Y') FROM yourTableName
GROUP BY MONTH(yourColumnName), YEAR(yourColumnName) DESC;
DATE_FORMAT(컬럼명, '%m-%Y'): 날짜를 '월-연도' 형식의 문자열로 변환합니다.GROUP BY MONTH(), YEAR(): 월과 연도를 기준으로 레코드를 묶습니다.DESC: 최신 연도부터 내림차순으로 정렬합니다.
예제 테이블 생성하기
개념을 이해하기 위해 먼저 테스트용 테이블을 만들어 보겠습니다. 아래는 테이블 생성 쿼리입니다.
mysql> create table GroupMonthAndYearDemo
-> (
-> DueDate datetime
-> );
Query OK, 0 rows affected (1.49 sec)
샘플 데이터 삽입
다음 쿼리로 현재 시점을 기준으로 연도가 다른 여러 날짜 데이터를 삽입합니다.
mysql> insert into GroupMonthAndYearDemo values(now());
Query OK, 1 row affected (0.11 sec)
mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 2 year));
Query OK, 1 row affected (0.12 sec)
mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -2 year));
Query OK, 1 row affected (0.10 sec)
mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 1 year));
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -1 year));
Query OK, 1 row affected (0.14 sec)
date_add(now(), interval N year) 함수를 사용하면 현재 날짜에서 지정한 연도만큼 더하거나 뺀 값을 손쉽게 만들 수 있습니다.
저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from GroupMonthAndYearDemo;
실행 결과는 다음과 같습니다.
+---------------------+
| DueDate |
+---------------------+
| 2018-12-06 13:12:34 |
| 2020-12-06 13:12:59 |
| 2016-12-06 13:13:08 |
| 2019-12-06 13:13:14 |
| 2017-12-06 13:13:19 |
+---------------------+
5 rows in set (0.00 sec)
월과 연도 기준으로 그룹화하는 쿼리
이제 DATE_FORMAT()과 GROUP BY를 사용해 월과 연도별로 데이터를 묶어 보겠습니다.
mysql> select DATE_FORMAT(DueDate, '%m-%Y') from GroupMonthAndYearDemo
-> GROUP BY MONTH(DueDate), YEAR(DueDate) DESC;
실행 결과, 월과 연도가 내림차순으로 그룹화되어 출력됩니다.
+-------------------------------+
| DATE_FORMAT(DueDate, '%m-%Y') |
+-------------------------------+
| 12-2020 |
| 12-2019 |
| 12-2018 |
| 12-2017 |
| 12-2016 |
+-------------------------------+
5 rows in set, 2 warnings (0.00 sec)
정리 및 참고 사항
이처럼 MySQL에서는 DATE_FORMAT() 함수로 원하는 날짜 형식을 지정하고, GROUP BY 절에 MONTH()와 YEAR() 함수를 넣어 간단히 월·연도 단위 집계를 할 수 있습니다.
추가로 알아두면 좋은 팁은 다음과 같습니다.
- 형식 변경 : '%Y-%m'으로 지정하면 '2020-12'처럼 연도가 앞에 오는 형식으로 출력할 수 있어 정렬 가독성이 더 좋아집니다.
- 경고(warnings) 무시 : 결과에 '2 warnings'가 표시될 수 있는데, 이는 GROUP BY 절의 정렬 방식과 관련된 것으로 대부분 무시해도 됩니다. 필요하다면
ORDER BY절을 별도로 사용해 정렬을 명시하는 것이 좋습니다. - 집계 함수 활용 : 실무에서는
COUNT(*),SUM()같은 집계 함수를 함께 사용해 월별 건수나 합계를 구하는 경우가 많습니다.