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

MySQL:如何通过年份与周数字段筛选指定日期范围内的库存记录

解决MySQL中年周数据按日期范围筛选的问题

嘿,这个需求的核心其实是把year和week_number组合转换成对应的日期区间,再和你给定的start_date、end_date做重叠判断就行。我给你详细说下怎么写:

核心思路

每个年周对应一个连续的7天区间,我们需要计算出这个区间的起始和结束日期,然后判断它和目标日期范围有重叠——只要两个区间有交集,这条数据就需要被筛选出来。

完整查询语句

假设你的表名为stock_table,直接用下面的SQL就行(记得替换成你的实际表名和日期参数):

SELECT year, week_number, stock_count
FROM stock_table
WHERE
    -- 计算当前年周的起始日期(ISO标准,周一为每周第一天)
    STR_TO_DATE(CONCAT(year, '-', week_number, '-1'), '%X-%V-%u') <= '2024-03-10'
    AND
    -- 计算当前年周的结束日期(周日)
    DATE_ADD(STR_TO_DATE(CONCAT(year, '-', week_number, '-1'), '%X-%V-%u'), INTERVAL 6 DAY) >= '2024-02-20';

关键细节说明

  • 周模式选择:上面用的是ISO周标准(%X-%V-%u),也就是周一作为每周的第一天,且每年的第一周至少包含4天。如果你的业务里周是从周日开始的,那要调整格式符:
    把%X-%V-%u换成%Y-%U-%w,起始日期用STR_TO_DATE(CONCAT(year, '-', week_number, '-0'), '%Y-%U-%w')(%w中0代表周日),结束日期同样加6天。
  • 日期参数:你可以把语句里的具体日期字符串换成变量(比如应用程序传参),或者直接写死成你需要的日期。
  • 性能优化:如果你的表数据量很大,这种动态计算日期的写法可能没法利用索引。建议可以考虑在表中新增两个字段week_start_date和week_end_date,预先计算好每个年周的区间并存储,然后直接基于这两个字段做范围查询,这样效率会高很多。

举个例子

假设你要筛选2024年2月20日到3月10日的数据:

  • 2024年第8周(2024-02-19至2024-02-25)和目标区间重叠(20日-25日在范围内),会被选中;
  • 2024年第9周(2024-02-26至2024-03-03)完全在范围内,会被选中;
  • 2024年第10周(2024-03-04至2024-03-10)完全在范围内,会被选中;
  • 2024年第11周(2024-03-11至2024-03-17)和目标区间无重叠,不会被选中。

内容的提问来源于stack exchange,提问作者Gerald Allay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:27:28