MySQL / SQL: Nur nach Datum in einer Datetime-Spalte gruppieren

180

Eine Tabelle mit einer Spalte wie: mydate DATETIME ...

Ich habe eine Frage wie:

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

Dies wird vollständig gruppiert datetime, einschließlich Stunden und Minuten. Ich möchte die Gruppe bis zum Datum, YYYY/MM/DDnicht bis zum YYYY/MM/DD/HH/mm.

Weiß jemand, wie man das macht? Ich kann es immer noch tun (da ich atm bin), dynamisch in meinem Code, aber ich bereinige den Müllcode und dies kann über SQL erfolgen. Ich kann einfach nicht herausfinden, wie :(.

fmsf
quelle
1
Ein besserer Ansatz in dieser Antwort beschrieben !
Webcoder

Antworten:

285

Verwandeln Sie die Datums- und Uhrzeitangabe in ein Datum und dann in GROUP BY mit der folgenden Syntax:

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

Oder Sie können nach dem Alias ​​gruppieren, wie @ orlandu63 vorgeschlagen hat:

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

Obwohl ich nicht denke, dass es einen Unterschied zur Leistung machen wird, ist es etwas klarer.

Michael Haren
quelle
1
Bist du sicher, dass der zweite funktioniert? Unter SQL Server schlägt dies fehl, und dies aus gutem Grund. Ich würde erwarten, dass es auch anderswo scheitert. Können Sie bestätigen, dass MySQL diese Abfrage tatsächlich verarbeitet?
Tomalak
1
Ich habe es gerade versucht und es funktioniert gut. MySQL ist gegenüber GROUP BY freizügiger und vertraut darauf, dass Sie eine Abfrage schreiben, die nicht mehrdeutig ist.
Bill Karwin
Danke für die Information. Ich kann mich nicht entscheiden, ob dies eine gute Sache ist oder nicht, aber es passt gut zu meiner Meinung über MySQL. Von einem technischen POV - wie soll das funktionieren? Ich kann mir nur vorstellen, dass der Abfrageparser den Alias ​​in der GROUP BY-Klausel durch den tatsächlichen Ausdruck ersetzt.
Tomalak
17
Es ist eine Leistungsfalle! Beachten Sie, dass Sie mit einer solchen Funktion - DATE () keine Indizes für diese Spalte nutzen können.
Kamil Bednarz
Ich habe den ersten benutzt und es hat wie ein Zauber funktioniert. Danke für diesen Tipp
Helen Neely
20

Ich stellte fest, dass ich mich nach Monat und Jahr gruppieren musste, sodass keines der oben genannten Verfahren für mich funktionierte. Stattdessen habe ich date_format verwendet

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 
Richard Merchant
quelle
2
Abfrage ist nicht in Ordnung
ZJS
18

Oder:

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

Effizienter (glaube ich), weil Sie mydate nicht zweimal pro Zeile umsetzen müssen.

muhen
quelle
7
Ich wäre sehr überrascht, wenn MySQL die Konvertierung zweimal ausführen würde. Nur aggregierte Funktionen und Ausdrücke in der Gruppe nach Liste sind in Gruppen durch ausgewählte Anweisungen zulässig. Die Engine muss bereits wissen, dass die beiden Ausdrücke gleich sind.
Tmdean
1
@Tmdean, 'Nur aggregierte Funktionen und Ausdrücke in der Gruppe nach Liste sind in der Gruppe nach ausgewählten Anweisungen zulässig' - können Sie dies in einfacheren Worten erklären?
Istiaque Ahmed
9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

Es wird die Stunde nach Summe von einem bestimmten Tag geben!

RaK Chowdary
quelle