Deux étapes :
Premièrement, vous avez besoin d'une opération de troncation hebdomadaire – qui prendra votre DATETIME
article et restituer minuit le dimanche précédent (si votre règle métier indique que la semaine commence le dimanche).
Cela devient un élément GROUP BY approprié. Le hack WEEK() / YEAR() n'est pas adapté à cela. Cela fait vraiment un gâchis la dernière/première semaine de chaque année.
D'après mon expérience, cette exxpression fera le tour de la semaine pour vous, du dimanche au samedi,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
Pour obtenir les semaines du lundi au dimanche, utilisez cette expression.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Vous pouvez donc le faire.
SELECT COUNT(whatever), SUM(whatelse),
FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
FROM TABLE
GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
Comment regrouper par semaine dans MySQL ?
Deuxièmement, vous devez ajouter six jours à cette date tronquée, afin de pouvoir afficher le dernier jour de chaque semaine avec le premier jour.
C'est un bon moyen de le faire, avec une requête imbriquée
SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
FROM (
SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
FROM TABLE
GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
) AS summary
ORDER BY weekstart
Faire beaucoup de cela? Je vous suggère de créer un TRUNC_WEEK
stocké fonction.