Nhóm dữ liệu theo ngày (bỏ qua giờ) khi cột là DATETIME
Khi cột lưu trữ là DATETIME nhưng bạn muốn nhóm theo ngày (chỉ so sánh phần ngày), dùng hàm DATE() trong mệnh đề GROUP BY.
Cú pháp
SELECT * FROM yourTableName GROUP BY DATE(yourColumnName);
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE groupByDateDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName VARCHAR(20),
-> UserPostDatetime DATETIME
-> );
Chèn dữ liệu (có nhiều bản ghi cùng ngày, khác giờ):
mysql> INSERT INTO groupByDateDemo(UserName, UserPostDatetime) VALUES
('Larry', '2018-01-02 13:45:40'),
('Mike', '2018-01-02 13:45:40'),
('Sam', '2019-01-28 12:30:34'),
('David', '2019-02-10 11:35:54'),
('Maxwell', '2019-02-10 11:35:54');
Dữ liệu gốc:
+----+----------+---------------------+ | Id | UserName | UserPostDatetime | +----+----------+---------------------+ | 1 | Larry | 2018-01-02 13:45:40 | | 2 | Mike | 2018-01-02 13:45:40 | | 3 | Sam | 2019-01-28 12:30:34 | | 4 | David | 2019-02-10 11:35:54 | | 5 | Maxwell | 2019-02-10 11:35:54 | +----+----------+---------------------+
GROUP BY DATE(UserPostDatetime):
mysql> SELECT * FROM groupByDateDemo GROUP BY DATE(UserPostDatetime);
Kết quả (mỗi ngày 1 bản ghi đại diện):
+----+----------+---------------------+ | Id | UserName | UserPostDatetime | +----+----------+---------------------+ | 1 | Larry | 2018-01-02 13:45:40 | | 3 | Sam | 2019-01-28 12:30:34 | | 4 | David | 2019-02-10 11:35:54 | +----+----------+---------------------+
Lưu ý quan trọng
- ONLY_FULL_GROUP_BY: MySQL 5.7+ bật mặc định, SELECT * với GROUP BY có thể báo lỗi. Hãy chỉ định cột cụ thể hoặc dùng ANY_VALUE()
- Hiệu năng: DATE() không dùng được index. Tốt hơn tạo cột DATE riêng hoặc dùng generated column
- Thay thế:
CAST(UserPostDatetime AS DATE)hoặcDATE_FORMAT(UserPostDatetime, '%Y-%m-%d')
Best Practice cho báo cáo theo ngày
SELECT DATE(UserPostDatetime) AS PostDate, COUNT(*) AS PostCount FROM groupByDateDemo GROUP BY DATE(UserPostDatetime);