MySQL按周分组查询需求:添加周起止日期至结果集
MySQL按周分组并显示周起止日期实现方案
我来帮你搞定这个需求~ 不同版本的MySQL实现方式略有区别,我分两种情况给你详细示例:
MySQL 8.0+ 版本(推荐)
这个版本支持DATE_TRUNC()函数,能直接快速截断日期到周级别,写法更简洁:
SELECT DATE_TRUNC('week', record_date) AS week_start, -- 周起始日期(默认周日为第一天) DATE_ADD(DATE_TRUNC('week', record_date), INTERVAL 6 DAY) AS week_end, -- 周结束日期(周六) -- 如果需要以周一作为周起始,调整起始日期计算: -- DATE_ADD(DATE_TRUNC('week', record_date), INTERVAL 1 DAY) AS week_start, -- DATE_ADD(DATE_TRUNC('week', record_date), INTERVAL 7 DAY) AS week_end, CONCAT(YEAR(week_start), '-W', LPAD(WEEK(record_date, 1), 2, '0')) AS year_week, -- 带年份的周编号(避免跨年混淆) COUNT(*) AS total_records -- 替换成你的实际聚合逻辑,比如SUM(amount)等 FROM your_table -- 替换成你的表名 WHERE record_date BETWEEN '2024-01-01' AND '2024-12-31' -- 可选:添加日期过滤条件 GROUP BY week_start, week_end, year_week ORDER BY week_start;
关键说明:
DATE_TRUNC('week', record_date)默认以周日作为一周的第一天,如果需要改成周一,直接给起始日期加1天即可,结束日期对应加7天(这样结束日期就是周日)。WEEK(record_date, 1)里的1参数表示以周一为周起始,改成0则是周日为起始,和前面的日期计算保持一致就行。year_week字段是为了避免跨年时周编号重复(比如2023年最后一周和2024年第一周可能周编号都是52/1),显示更清晰。
MySQL 5.7及以下版本
这个版本没有DATE_TRUNC(),需要用日期函数手动计算起止日期:
情况1:以周一作为周起始
SELECT DATE_SUB(record_date, INTERVAL WEEKDAY(record_date) DAY) AS week_start, -- 周一为起始 DATE_ADD(DATE_SUB(record_date, INTERVAL WEEKDAY(record_date) DAY), INTERVAL 6 DAY) AS week_end, -- 周日为结束 CONCAT(YEAR(week_start), '-W', LPAD(WEEK(record_date, 1), 2, '0')) AS year_week, COUNT(*) AS total_records FROM your_table GROUP BY week_start, week_end, year_week ORDER BY week_start;
情况2:以周日作为周起始
SELECT DATE_SUB(record_date, INTERVAL DAYOFWEEK(record_date)-1 DAY) AS week_start, -- 周日为起始 DATE_ADD(DATE_SUB(record_date, INTERVAL DAYOFWEEK(record_date)-1 DAY), INTERVAL 6 DAY) AS week_end, -- 周六为结束 CONCAT(YEAR(week_start), '-W', LPAD(WEEK(record_date, 0), 2, '0')) AS year_week, COUNT(*) AS total_records FROM your_table GROUP BY week_start, week_end, year_week ORDER BY week_start;
关键说明:
WEEKDAY(record_date)返回0(周一)到6(周日),所以减去这个数值就能得到本周一的日期。DAYOFWEEK(record_date)返回1(周日)到7(周六),减1后减去对应天数就能得到本周日的日期。
最后记得把代码里的your_table、record_date、total_records这些替换成你实际的表名、日期字段和聚合逻辑哦~
内容的提问来源于stack exchange,提问作者mynameisbutt
相关产品推荐
相关产品推荐

