如何从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
相关产品推荐
相关产品推荐

