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

MySQL使用YEARWEEK函数获取上周数据时跨年结果异常

问题原因

你得到错误结果的核心原因是错误对YEARWEEK的返回值做了直接数值减法:

  • YEARWEEK(日期, 1)返回的是拼接格式的整数:前4位是年份,后2位是周序号,比如2022年第1周返回整数值202201
  • 直接对这个整数做-1运算时,只会执行普通整数减法得到202200,不会自动触发跨年借位逻辑——不会自动把年份减1、把周序号替换为上一年最后一周的序号(2021年最后一周是52周,部分年份最后一周为53周)
  • 你语句里的date_format调用是多余的,YEARWEEK本身就可以直接接收标准日期格式的字符串或日期类型值作为入参。
正确写法

不要对YEARWEEK返回的拼接整数做算术运算,直接先把基准日期往前偏移7天,再计算偏移后日期的年周值,由MySQL原生日期函数自动处理跨年、周序号跨52/53周的边界问题,完全不会出现借位错误。

  1. 计算指定日期对应上周的年周值:
-- 以2022-01-03为例,返回结果为202152,符合预期
SELECT YEARWEEK(DATE_SUB('2022-01-03', INTERVAL 7 DAY), 1);
  1. 业务场景中查询上周全量数据的通用写法:
SELECT * FROM 你的表名
WHERE YEARWEEK(时间字段名, 1) = YEARWEEK(DATE_SUB(CURDATE(), INTERVAL 7 DAY), 1);

注意:所有YEARWEEK调用必须保持第二个mode参数一致,你当前用的mode=1代表「周一为每周第一天,新年第一个包含4天以上的周为第1周」,如果混用其他mode值会出现周范围匹配错位。

内容的提问来源于stack exchange,提问作者xiaofei li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:57:20