Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL GROUP BY theo date khi cột là datetime?

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ặc DATE_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);