MySQL / SQL: Chỉ nhóm theo ngày trên cột Ngày tháng


182

Có một bảng với một cột như: mydate DATETIME...

Tôi có một truy vấn như:

SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;

Điều này sẽ nhóm đầy đủ datetime, bao gồm cả giờ và phút. Tôi muốn làm cho nhóm bằng, chỉ bằng ngày YYYY/MM/DDkhông phải bởi YYYY/MM/DD/HH/mm.

Bất cứ ai biết làm thế nào để làm điều này? Tôi vẫn có thể làm điều đó (như tôi là atm), một cách linh hoạt trong mã của tôi, nhưng tôi đang làm sạch mã rác và điều này có thể được thực hiện thông qua SQL Tôi chỉ không thể tìm hiểu làm thế nào :(.


1
Một cách tiếp cận tốt hơn được mô tả trong câu trả lời này !
webcoder

Câu trả lời:


287

Truyền datetime đến một ngày, sau đó NHÓM THEO bằng cú pháp này:

SELECT SUM(foo), DATE(mydate) FROM a_table GROUP BY DATE(a_table.mydate);

Hoặc bạn có thể NHÓM THEO bí danh như @ orlandu63 đề xuất:

SELECT SUM(foo), DATE(mydate) DateOnly FROM a_table GROUP BY DateOnly;

Mặc dù tôi không nghĩ nó sẽ tạo ra bất kỳ sự khác biệt nào đối với hiệu suất, nhưng nó rõ ràng hơn một chút.


1
Bạn có chắc chắn cái thứ hai hoạt động? Trên SQL Server, điều này không thành công và nó không thành công vì một lý do chính đáng. Tôi hy vọng nó sẽ thất bại ở bất cứ nơi nào khác. Bạn có thể xác nhận rằng MySQL thực sự xử lý truy vấn này?
Tomalak

1
Tôi chỉ thử nó và nó hoạt động tốt. MySQL được cho phép nhiều hơn về NHÓM THEO và nó tin tưởng bạn viết một truy vấn không mơ hồ.
Bill Karwin

Cảm ơn bạn về thông tin. Tôi không thể quyết định xem đây có phải là điều tốt hay không, nhưng nó phù hợp với quan điểm của tôi về MySQL. Từ một POV kỹ thuật - làm thế nào là nó hoạt động? Tôi chỉ có thể tưởng tượng rằng trình phân tích cú pháp truy vấn thay thế bí danh trong mệnh đề GROUP BY bằng biểu thức thực tế.
Tomalak

17
Đó là một cái bẫy hiệu suất! Hãy nhớ rằng việc sử dụng hàm như vậy - DATE () không cho phép bạn tận dụng các chỉ mục trên cột này.
Kamil Bednarz

Tôi đã sử dụng cái đầu tiên và nó hoạt động như một lá bùa. Cảm ơn vì mẹo này
Helen Neely

20

Tôi thấy rằng tôi cần phải nhóm theo tháng và năm vì vậy cả hai cách trên đều không phù hợp với tôi. Thay vào đó tôi đã sử dụng date_format

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 

2
truy vấn không đúng thứ tự
ZJS

19

Hoặc là:

SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;

Hiệu quả hơn (tôi nghĩ vậy.) Bởi vì bạn không phải sử dụng mydate hai lần mỗi hàng.


7
Tôi sẽ rất ngạc nhiên nếu MySQL chạy chuyển đổi hai lần. Chỉ các hàm và biểu thức tổng hợp trong nhóm theo danh sách mới được phép trong nhóm theo các câu lệnh chọn. Động cơ đã phải biết rằng hai biểu thức là như nhau.
Tmdean

1
@Tmdean, 'Chỉ các hàm và biểu thức tổng hợp trong nhóm theo danh sách mới được phép trong nhóm bằng các câu lệnh chọn' - bạn có thể giải thích nó bằng những từ dễ hơn không?
Istiaque Ahmed

9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

Nó sẽ cung cấp cho từng giờ từ một ngày cụ thể!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.