Vous pouvez utiliser à la fois YEAR(timestamp)
et WEEK(timestamp)
, et utilisez ces deux expressions dans le SELECT
et le GROUP BY
clause.
Pas trop élégant, mais fonctionnel...
Et bien sûr, vous pouvez également combiner ces deux parties de date dans une seule expression, c'est-à-dire quelque chose comme
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Modifier :Comme le souligne Martin
vous pouvez également utiliser le YEARWEEK(mysqldatefield)
fonction, bien que sa sortie ne soit pas aussi conviviale que la formule plus longue ci-dessus.
Modifier 2 [3 ans et demi plus tard !] :YEARWEEK(mysqldatefield)
avec le deuxième argument optionnel (mode
) défini sur 0 ou 2 est probablement le meilleur moyen d'agréger par complet semaines (c'est-à-dire y compris pour les semaines qui chevauchent le 1er janvier), si c'est ce que l'on souhaite. Le YEAR() / WEEK()
l'approche initialement proposée dans cette réponse a pour effet de diviser les données agrégées pour un tel "chevauchement" semaines sur deux :une avec l'ancienne année, une avec la nouvelle année.
Une coupe nette chaque année, au prix d'avoir jusqu'à deux semaines partielles, une à chaque extrémité, est souvent souhaitée en comptabilité, etc. et pour cela le YEAR() / WEEK()
l'approche est meilleure.