Hai bước để thực hiện điều này:
Một, bạn cần thao tác cắt ngắn một tuần - thao tác này sẽ mất DATETIME
của bạn mặt hàng và trả lại vào nửa đêm của Chủ nhật trước đó (nếu quy tắc kinh doanh của bạn cho biết rằng tuần bắt đầu vào Chủ nhật).
Điều đó trở thành một mục GROUP BY phù hợp. Hack WEEK () / YEAR () không phù hợp cho việc này. Nó thực sự tạo ra một mớ hỗn độn vào tuần cuối cùng / đầu tiên của mỗi năm.
Theo kinh nghiệm của tôi, biểu thức exxpression này sẽ thực hiện thủ thuật cắt ngắn một tuần cho bạn, Chủ nhật - Thứ bảy,
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))
Để xem các tuần từ Thứ Hai đến Chủ Nhật, hãy sử dụng biểu thức này.
FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))
Vì vậy, bạn có thể làm điều này.
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))
Làm cách nào để nhóm theo tuần trong MySQL?
Thứ hai, bạn cần thêm sáu ngày vào ngày bị cắt ngắn đó, để bạn có thể hiển thị ngày cuối cùng của mỗi tuần cùng với ngày đầu tiên.
Đây là một cách tốt để làm điều đó, với một truy vấn lồng nhau
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
Làm rất nhiều điều này? Tôi khuyên bạn nên tạo một TRUNC_WEEK
được lưu trữ chức năng.