Saltar al contenido

¿Cómo agrupar por semana en MySQL?

Hola, descubrimos la solución a lo que buscabas, has scroll y la verás más abajo.

Solución:

Puedes usar ambos YEAR(timestamp) y WEEK(timestamp)y use ambas expresiones en el SELECT y el GROUP BY cláusula.

No demasiado elegante, pero funcional…

Y, por supuesto, también puede combinar estas dos partes de la fecha en una sola expresión, es decir, algo como

SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))

Editar: Como señala Martin, también puedes usar el YEARWEEK(mysqldatefield) función, aunque su salida no es tan agradable a la vista como la fórmula más larga anterior.


Editar 2 [3 1/2 years later!]:
YEARWEEK(mysqldatefield) con el segundo argumento opcional (mode) establecido en 0 o 2 es probablemente la mejor manera de agregar por completo semanas (es decir, incluidas las semanas que superan el 1 de enero), si eso es lo que se desea. El YEAR() / WEEK() El enfoque propuesto inicialmente en esta respuesta tiene el efecto de dividir los datos agregados para tales “a horcajadas” semanas en dos: una con el año anterior, otra con el año nuevo.
Un corte limpio cada año, a costa de tener hasta dos semanas parciales, una en cada extremo, a menudo se desea en contabilidad, etc. y por eso el YEAR() / WEEK() el enfoque es mejor.

La respuesta aceptada anterior no funcionó para mí, porque ordenó las semanas por orden alfabético, no por orden cronológico:

2012/1
2012/10
2012/11
...
2012/19
2012/2

Aquí está mi solución para contar y agrupar por semana:

SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, 
       YEAR(date), WEEK(date), COUNT(*)
FROM column_name
GROUP BY week_name
ORDER BY YEAR(DATE) ASC, WEEK(date) ASC

Genera:

YEAR/WEEK   YEAR   WEEK   COUNT
2011/51     2011    51      15
2011/52     2011    52      14
2012/1      2012    1       20
2012/2      2012    2       14
2012/3      2012    3       19
2012/4      2012    4       19

Lo descubrí… es un poco engorroso, pero aquí está.

FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

Y, si las reglas de su negocio dicen que sus semanas comienzan los lunes, cambie el -1 a -2.


Editar

Han pasado los años y finalmente me he puesto a escribir esto. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

Si para ti ha sido provechoso nuestro post, agradeceríamos que lo compartas con más seniors y nos ayudes a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *