MySQL / SQL: raggruppa per data solo su una colonna Datetime


182

Avere una tabella con una colonna come: mydate DATETIME...

Ho una domanda come:

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

Questo raggrupperà per intero datetime, inclusi ore e minuti. Desidero fare il gruppo entro, solo entro la data e YYYY/MM/DDnon entro ilYYYY/MM/DD/HH/mm .

Qualcuno sa come farlo? Posso ancora farlo (come sono atm), in modo dinamico nel mio codice, ma sto pulendo il codice cestino e questo può essere fatto attraverso l'SQL che non riesco proprio a scoprire come :(.


1
Un approccio migliore descritto in questa risposta !
webcoder il

Risposte:


287

Trasmetti il ​​datetime a una data, quindi GROUP BY utilizzando questa sintassi:

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

Oppure puoi Raggruppare per l'alias come suggerito da @ orlandu63:

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

Anche se non credo che farà alcuna differenza nelle prestazioni, è un po 'più chiaro.


1
Sei sicuro che il secondo funzioni? Su SQL Server, questo ha esito negativo e non riesce per una buona ragione. Mi aspetterei che fallisca anche altrove. Puoi confermare che MySQL gestisce effettivamente questa query?
Tomalak,

1
L'ho appena provato e funziona benissimo. MySQL è più permissivo su GROUP BY e ti fida di scrivere una query non ambigua.
Bill Karwin,

Grazie per le informazioni. Non riesco a decidere se questa è una cosa positiva o no, ma si adatta perfettamente alla mia opinione su MySQL. Da un punto di vista tecnico: come dovrebbe funzionare? Posso solo immaginare che il parser di query sostituisca l'alias nella clausola GROUP BY con l'espressione effettiva.
Tomalak

17
È una trappola per le prestazioni! Tieni presente che l'utilizzo di tale funzione - DATE () non ti consente di sfruttare gli indici su questa colonna.
Kamil Bednarz,

Ho usato il primo e ha funzionato come un fascino. Grazie per questo consiglio
Helen Neely,

20

Ho scoperto che dovevo raggruppare per mese e anno, quindi nessuno dei precedenti ha funzionato per me. Invece ho usato date_format

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

2
la query è fuori servizio
ZJS

19

O:

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

Più efficiente (penso.) Perché non devi lanciare mydate due volte per riga.


7
Sarei molto sorpreso se MySQL eseguisse la conversione due volte. Solo le funzioni e le espressioni aggregate nel gruppo per elenco sono consentite nel gruppo da istruzioni selezionate. Il motore deve già sapere che le due espressioni sono uguali.
Tmdean,

1
@Tmdean, 'Solo le funzioni e le espressioni aggregate nel gruppo per elenco sono consentite nel gruppo da istruzioni selezionate' - puoi spiegarlo in parole più semplici?
Istiaque Ahmed,

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

Dà l'ora per somma da un giorno particolare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.