MySQL에서 시간과 관계없이 날짜별로 그룹화하기
테이블에 같은 날짜가 서로 다른 시간 값으로 여러 번 저장되어 있는 경우, GROUP BY DATE()를 사용하면 시간은 무시하고 날짜 단위로 간단하게 그룹화할 수 있습니다.
DATE() 함수는 DATETIME 값에서 날짜 부분만 추출해 주기 때문에, 이 함수를 GROUP BY 절에 적용하면 하루 안의 여러 레코드가 하나의 그룹으로 묶이게 됩니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable692 (DueDatetime datetime); Query OK, 0 rows affected (0.97 sec)
2. 레코드 삽입
insert 명령을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable692 values('2019-07-21 10:20:00');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable692 values('2019-06-11 11:00:10');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable692 values('2019-07-21 11:00:10');
Query OK, 1 row affected (1.97 sec)
mysql> insert into DemoTable692 values('2019-07-21 12:10:10');
Query OK, 1 row affected (0.18 sec)
3. 전체 레코드 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable692;
실행 결과는 다음과 같습니다.
+---------------------+ | DueDatetime | +---------------------+ | 2019-07-21 10:20:00 | | 2019-06-11 11:00:10 | | 2019-07-21 11:00:10 | | 2019-07-21 12:10:10 | +---------------------+ 4 rows in set (0.00 sec)
동일한 날짜인 2019-07-21에 세 개의 레코드가 서로 다른 시간 값으로 저장되어 있는 것을 확인할 수 있습니다.
4. 날짜별 그룹화 쿼리
시간과 관계없이 날짜(DATE) 기준으로 그룹화하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable692 GROUP BY DATE(DueDatetime);
실행 결과:
+---------------------+ | DueDatetime | +---------------------+ | 2019-07-21 10:20:00 | | 2019-06-11 11:00:10 | +---------------------+ 2 rows in set (0.00 sec)
네 개의 레코드가 두 개의 날짜(2019-07-21, 2019-06-11)로 그룹화되어 출력되었습니다.
참고 사항
실무에서는 SELECT 절에 그룹 기준 컬럼과 집계 함수를 함께 사용하는 것이 좋습니다. 예를 들어 다음과 같이 날짜별 레코드 수를 함께 조회할 수 있습니다.
mysql> SELECT DATE(DueDatetime) AS DueDate, COUNT(*) AS Cnt
-> FROM DemoTable692
-> GROUP BY DATE(DueDatetime);
또한 MySQL 5.7 이상에서 ONLY_FULL_GROUP_BY 모드가 활성화된 경우, GROUP BY에 포함되지 않은 일반 컬럼을 SELECT 하는 것이 제한되므로 위 예제처럼 DATE() 함수의 결과를 직접 선택하는 방식을 사용하는 것이 권장됩니다.