Dwa kroki do tego:
Po pierwsze, potrzebujesz tygodniowej operacji skrócenia — to zajmie Twoją DATETIME
przedmiot i oddaj północ w poprzednią niedzielę (jeśli reguła biznesowa mówi, że tydzień zaczyna się w niedzielę).
Staje się to odpowiednią pozycją GROUP BY. Hack WEEK() / YEAR() nie jest do tego odpowiedni. To naprawdę robi bałagan w ostatnim/pierwszym tygodniu każdego roku.
Z mojego doświadczenia wynika, że to wyrażenie zrobi za ciebie tygodniową sztuczkę, niedziela - sobota,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
Aby uzyskać od poniedziałku do niedzieli, użyj tego wyrażenia.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Więc możesz to zrobić.
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))
Jak grupować według tygodnia w MySQL?
Po drugie, musisz dodać sześć dni do tej skróconej daty, aby móc wyświetlać ostatni dzień każdego tygodnia wraz z pierwszym dniem.
Jest to dobry sposób na zrobienie tego za pomocą zapytania zagnieżdżonego
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
Robisz tego dużo? Proponuję utworzyć zapisany TRUNC_WEEK
funkcja.