To trin til dette:
For det første skal du bruge en uge-truncate-operation -- som vil tage din DATETIME
genstand og giv midnat tilbage den foregående søndag (hvis din forretningsregel siger, at ugen begynder på søndag).
Det bliver en passende GROUP BY-vare. WEEK() / YEAR() hacket er ikke egnet til dette. Det gør virkelig noget rod i den sidste/første uge af hvert år.
Det er min erfaring, at dette udtryk vil gøre det ugentlige trick for dig, søndag - lørdag,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
For at få mandag - søndag uger, brug dette udtryk.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Så du kan gøre dette.
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))
Hvordan grupperes efter uge i MySQL?
For det andet skal du tilføje seks dage til den trunkerede dato, så du kan vise den sidste dag i hver uge sammen med den første dag.
Dette er en god måde at gøre det på, med en indlejret forespørgsel
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ør du meget af dette? Jeg foreslår, at du opretter en lagret TRUNC_WEEK
funktion.