Två steg till detta:
För det första behöver du en vecka-trunkera operation -- som tar din DATETIME
föremål och ge tillbaka midnatt föregående söndag (om din affärsregel säger att veckan börjar på söndag).
Det blir ett passande GROUP BY-objekt. Hacket WEEK() / YEAR() är inte lämpligt för detta. Det gör verkligen oreda den sista/första veckan varje år.
Enligt min erfarenhet kommer det här uttrycket att göra veckans trunkering för dig, söndag - lördag,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
För att få måndag - söndag veckor, använd detta uttryck.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Så du kan göra detta.
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))
Hur grupperar man efter vecka i MySQL?
För det andra måste du lägga till sex dagar till det trunkerade datumet, så att du kan visa den sista dagen i varje vecka tillsammans med den första dagen.
Det här är ett bra sätt att göra det, med en kapslad fråga
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
Göra mycket av detta? Jag föreslår att du skapar en lagrad TRUNC_WEEK
funktion.