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

SQL技术问题:无法获取上一年最后四周(W50、51、52)数据求修正

解决方案:基于日期范围替代周数比较

原代码的核心问题是仅通过周数字段做范围比较,忽略了年份维度,跨年时(比如当前是新年第1周),DATEPART(WEEK, GETDATE())-4会得到负数,无法匹配去年年末的周数(如50/51/52周)。

最稳妥的修改方式是直接基于实际日期范围筛选,完全避开周数的跨年逻辑问题:

SELECT id,    
       EXTRACT(WEEK FROM transaction_date) AS week
FROM table1
WHERE transaction_date >= DATEADD(WEEK, -4, GETDATE())
  AND transaction_date <= GETDATE()

为什么这个方案更可靠?

  • 直接以transaction_date为筛选依据,不管是年初还是年中,都能准确获取当前日期往前推4周的所有交易数据,无需考虑周数的循环问题。
  • 逻辑更直观,避免了周数计算带来的歧义(不同数据库对周数的定义可能略有差异,比如是否以周一或周日为一周起始)。

如果业务需求是严格匹配最近4个自然周(而非滚动28天),可以结合年份和周数做判断,处理跨年场景:

SELECT id,    
       EXTRACT(YEAR FROM transaction_date) AS trans_year,
       EXTRACT(WEEK FROM transaction_date) AS trans_week
FROM table1
WHERE 
    -- 情况1:交易日期在当前年份,且周数在最近4周范围内
    (trans_year = DATEPART(YEAR, GETDATE())
     AND trans_week BETWEEN DATEPART(WEEK, GETDATE()) - 4 AND DATEPART(WEEK, GETDATE()))
    OR
    -- 情况2:交易日期在上一年,且属于当前日期往前4周覆盖的去年周数
    (trans_year = DATEPART(YEAR, GETDATE()) - 1
     AND trans_week >= DATEPART(WEEK, DATEADD(WEEK, -4, GETDATE())))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:28:22