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.