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

