Due passaggi per questo:
Uno, hai bisogno di un'operazione di troncamento di una settimana, che richiederà il tuo DATETIME
articolo e restituisci la mezzanotte della domenica precedente (se la tua regola aziendale dice che la settimana inizia di domenica).
Questo diventa un elemento GROUP BY adatto. L'hack WEEK() / YEAR() non è adatto a questo. Fa davvero un pasticcio nell'ultima/prima settimana di ogni anno.
Nella mia esperienza, questa espressione farà per te il trucco del troncamento della settimana, da domenica a sabato,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
Per ottenere le settimane dal lunedì alla domenica, usa questa espressione.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Quindi puoi farlo.
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))
Come raggruppare per settimana in MySQL?
In secondo luogo, devi aggiungere sei giorni a quella data troncata, in modo da poter visualizzare l'ultimo giorno di ogni settimana insieme al primo giorno.
Questo è un buon modo per farlo, con una query nidificata
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
Fare molto di questo? Ti suggerisco di creare un TRUNC_WEEK
memorizzato funzione.