MySQL / SQL: Grupuj według daty tylko w kolumnie Datetime


182

Posiadanie tabeli z kolumną jak: mydate DATETIME...

Mam zapytanie takie jak:

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

Spowoduje to pogrupowanie według pełnych danych datetime, w tym godzin i minut. Chcę utworzyć grupę przed, tylko przed datą, YYYY/MM/DDnie przed YYYY/MM/DD/HH/mm.

Czy ktoś wie jak to zrobić? Nadal mogę to robić (jako bankomat), dynamicznie w kodzie, ale czyszczę kod śmieci i można to zrobić za pomocą SQL Po prostu nie mogę dowiedzieć się, jak :(.


1
Lepsze podejście opisane w tej odpowiedzi !
webcoder,

Odpowiedzi:


287

Prześlij datę i godzinę na datę, a następnie GROUP BY, używając tej składni:

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

Możesz też Pogrupować według aliasu, jak sugerował @ orlandu63:

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

Chociaż nie sądzę, by miało to jakikolwiek wpływ na wydajność, jest nieco jaśniejsze.


1
Czy jesteś pewien, że drugi działa? Na SQL Server to się nie udaje i nie bez powodu. Spodziewałbym się, że zawiedzie także gdzie indziej. Czy możesz potwierdzić, że MySQL faktycznie obsługuje to zapytanie?
Tomalak

1
Właśnie próbowałem i działa dobrze. MySQL jest bardziej liberalny w stosunku do GROUP BY i ufa, że ​​napiszesz zapytanie, które nie jest dwuznaczne.
Bill Karwin

Dzięki za informację. Nie mogę zdecydować, czy to dobra rzecz, czy nie, ale ładnie pasuje do mojej opinii o MySQL. Z technicznego POV - jak to ma działać? Mogę sobie tylko wyobrazić, że parser zapytań zastępuje alias w klauzuli GROUP BY rzeczywistym wyrażeniem.
Tomalak,

17
To pułapka wydajności! Należy pamiętać, że użycie takiej funkcji - DATE () nie pozwala na wykorzystanie indeksów w tej kolumnie.
Kamil Bednarz

Użyłem pierwszego i działało to jak urok. Dzięki za tę wskazówkę
Helen Neely

20

Odkryłem, że muszę grupować według miesiąca i roku, więc żadne z powyższych nie działało dla mnie. Zamiast tego użyłem date_format

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

2
zapytanie jest nieczynne
ZJS

19

Lub:

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

Bardziej wydajna (myślę.) Ponieważ nie musisz rzucać datą dwa razy w rzędzie.


7
Byłbym bardzo zaskoczony, gdyby MySQL uruchomił konwersję dwukrotnie. Tylko funkcje agregujące i wyrażenia w grupie według listy są dozwolone w grupie według instrukcji select. Silnik musi już wiedzieć, że oba wyrażenia są takie same.
Tmdean

1
@Tmdean, „Tylko funkcje agregujące i wyrażenia w grupie według listy są dozwolone w grupach według instrukcji select” - czy możesz to wyjaśnić łatwiejszymi słowami?
Istiaque Ahmed,

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

Da godzinę według sumy z określonego dnia!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.