You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:10