Você pode usar
YEAR(timestamp)
e WEEK(timestamp)
, e use essas duas expressões no SELECT
e o GROUP BY
cláusula. Não excessivamente elegante, mas funcional...
E é claro que você também pode combinar essas duas partes de data em uma única expressão, ou seja, algo como
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Editar :Como Martin aponta você também pode usar o
YEARWEEK(mysqldatefield)
função, embora sua saída não seja tão amigável quanto a fórmula mais longa acima. Editar 2 [3 1/2 anos depois!]:
YEARWEEK(mysqldatefield)
com o segundo argumento opcional (mode
) definido como 0 ou 2 é provavelmente a melhor maneira de agregar por completo semanas (ou seja, inclusive para semanas que ultrapassem 1º de janeiro), se isso for o desejado. O YEAR() / WEEK()
abordagem inicialmente proposta nesta resposta tem o efeito de dividir os dados agregados para tal "straddling" semanas em duas:uma com o ano anterior, outra com o ano novo.Um corte limpo a cada ano, ao custo de ter até duas semanas parciais, uma em cada extremidade, é frequentemente desejado em contabilidade etc. e para isso o
YEAR() / WEEK()
abordagem é melhor.