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


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.


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 

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.


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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.