Dua langkah untuk ini:
Pertama, Anda memerlukan operasi pemotongan seminggu -- yang akan memakan waktu DATETIME
item dan berikan kembali tengah malam pada hari Minggu sebelumnya (jika aturan bisnis Anda mengatakan bahwa minggu itu dimulai pada hari Minggu).
Itu menjadi item GROUP BY yang cocok. Peretasan WEEK() / YEAR() tidak cocok untuk ini. Itu benar-benar membuat kekacauan di minggu terakhir/pertama setiap tahun.
Menurut pengalaman saya, ekspresi ini akan melakukan trik pemotongan minggu untuk Anda, Minggu - Sabtu,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
Untuk mendapatkan minggu Senin - Minggu, gunakan ungkapan ini.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Jadi Anda bisa melakukan ini.
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))
Bagaimana cara mengelompokkan berdasarkan minggu di MySQL?
Kedua, Anda perlu menambahkan enam hari ke tanggal terpotong tersebut, sehingga Anda dapat menampilkan hari terakhir setiap minggu bersama dengan hari pertama.
Ini adalah cara yang baik untuk melakukannya, dengan kueri bersarang
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
Melakukan banyak hal ini? Saya sarankan Anda membuat TRUNC_WEEK
yang tersimpan fungsi.