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 :(.

fmsf
źródło
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.

Michael Haren
źródło
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 
Richard Merchant
źródło
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.

muczeć
źródło
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!

RaK Chowdary
źródło