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

如何从sport_data表获取上周(周一至周日)的所有数据?

正确获取上周(周一至周日)数据的MySQL实现

嘿,我来帮你搞定这个查询上周运动数据的问题!你之前尝试的条件思路方向是对的,但可能因为运算符优先级的问题导致结果不准确——INTERVAL的计算需要把括号加在DAYOFWEEK的表达式外面,不然会出现逻辑计算错误。

方法一:基于DAYOFWEEK的修正写法

首先明确MySQL中DAYOFWEEK()函数的返回规则:1代表周日,2代表周一,以此类推,7代表周六。

要获取上周周一00:00:00到本周一00:00:00之前的完整数据(即上周一至周日的所有记录),正确的WHERE条件应该是:

SELECT * 
FROM sport_data
WHERE date >= CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) + 5) DAY
  AND date < CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 2) DAY;

逻辑拆解:

  • CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) + 5) DAY:计算上周周一的日期。比如今天是周二(DAYOFWEEK返回3),3+5=8,减去8天就是上周周一。
  • CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 2) DAY:计算本周一的日期。同样以周二为例,3-2=1,减去1天就是本周一,用<而非<=可以避免包含本周一00:00:00的记录,确保只覆盖上周日23:59:59及之前的数据。

方法二:用WEEK()函数更直观

如果你觉得DAYOFWEEK的计算有点绕,也可以用WEEK()函数结合模式参数实现,可读性更强:

SELECT * 
FROM sport_data
WHERE WEEK(date, 1) = WEEK(CURDATE(), 1) - 1
  AND YEAR(date) = YEAR(CURDATE());

逻辑拆解:

  • WEEK(date, 1):第二个参数1指定周一作为一周的第一天,函数返回当前日期是当年的第几周。
  • WEEK(CURDATE(), 1) -1:直接得到上周的周数。
  • 加上YEAR(date) = YEAR(CURDATE())是为了避免跨年场景出错(比如1月1日查询上周,会匹配到去年12月的最后一周)。

验证小技巧

你可以先单独运行日期计算语句,确认区间是否符合预期:

-- 查看上周周一和本周一的具体日期
SELECT 
  CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) + 5) DAY AS last_monday,
  CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 2) DAY AS this_monday;

这样就能确保你的查询区间完全准确啦!

内容的提问来源于stack exchange,提问作者Steve Getsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:27:17