MySQL / SQL: Agrupar por fecha solo en una columna Fecha y hora

182

Tener una tabla con una columna como: mydate DATETIME...

Tengo una consulta como:

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

Esto agrupará por completo datetime, incluyendo horas y minutos. Deseo formar el grupo, solo por la fecha, YYYY/MM/DDno por el YYYY/MM/DD/HH/mm.

Alguien sabe cómo hacer esto? Todavía puedo hacerlo (como soy cajero automático), dinámicamente en mi código, pero estoy limpiando el código basura y esto se puede hacer a través del SQL. Simplemente no puedo descubrir cómo :(.

fmsf
fuente
1
¡Un mejor enfoque descrito en esta respuesta !
webcoder

Respuestas:

287

Transmita la fecha y hora a una fecha, luego GROUP BY usando esta sintaxis:

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

O puede AGRUPAR POR el alias como @ orlandu63 sugirió:

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

Aunque no creo que haga ninguna diferencia en el rendimiento, es un poco más claro.

Michael Haren
fuente
1
¿Estás seguro de que el segundo funciona? En SQL Server, esto falla y falla por una buena razón. Esperaría que fallara en cualquier otro lugar también. ¿Puedes confirmar que MySQL realmente maneja esta consulta?
Tomalak
1
Acabo de probarlo y funciona bien. MySQL es más permisivo sobre GROUP BY y confía en que escriba una consulta que no sea ambigua.
Bill Karwin
Gracias por la info. No puedo decidir si esto es bueno o no, pero encaja muy bien en mi opinión sobre MySQL. Desde un punto de vista técnico, ¿cómo se supone que funciona? Solo puedo imaginar que el analizador de consultas sustituye el alias en la cláusula GROUP BY con la expresión real.
Tomalak
17
Es una trampa de rendimiento! Tenga en cuenta que el uso de dicha función: DATE () no le permite aprovechar los índices en esta columna.
Kamil Bednarz
Usé el primero y funcionó a las mil maravillas. Gracias por este consejo
Helen Neely
20

Descubrí que necesitaba agrupar por mes y año, así que ninguno de los anteriores funcionó para mí. En su lugar, utilicé date_format

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 
Richard Merchant
fuente
2
consulta fuera de servicio
ZJS
19

O:

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

Más eficiente (creo). Porque no tiene que emitir mydate dos veces por fila.

mugir
fuente
77
Me sorprendería mucho si MySQL ejecutara la conversión dos veces. Solo las funciones y expresiones agregadas en el grupo por lista están permitidas en el grupo por sentencias select. El motor ya tiene que saber que las dos expresiones son iguales.
Tmdean
1
@Tmdean, 'Solo las funciones y expresiones agregadas en el grupo por lista están permitidas en el grupo por declaraciones selectas', ¿puede explicarlo en palabras más fáciles?
Istiaque Ahmed
9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

¡Dará la hora por suma de un día en particular!

RaK Chowdary
fuente