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

多表CASE WHEN问题:SQL查询CASE表达式未返回预期周值求助

看起来你的CASE表达式有几个关键问题没处理好,导致没返回预期的201814/201815格式的年份+周数。我来帮你拆解问题并修正:

核心问题分析

  • CASE语句不完整:你提供的代码片段没有写完,缺少分支逻辑、闭合括号和END关键字,这会直接导致语法错误。
  • 未正确偏移日期:你直接用GETDATE()获取当前日期的周数,但需求是要前2周和前1周的周数,必须用DATEADD来偏移日期。
  • 周数格式不统一:如果周数是个位数(比如第5周),直接拼接会得到20185而不是201805,需要补前导零保证两位格式。

修正后的完整查询

SELECT TOP 5 
    PlanningID, 
    ActivityID,
    CASE 
        WHEN [This Week - 2] = 'TRUE' THEN 
            -- 获取当前日期往前推2周的年份+两位ISO周数
            LEFT(CONVERT(VARCHAR(10), DATEADD(WEEK, -2, GETDATE()), 120), 4) 
            + RIGHT('0' + CAST(DATEPART(ISOWK, DATEADD(WEEK, -2, GETDATE())) AS VARCHAR(2)), 2)
        WHEN [This Week - 2] = 'FALSE' THEN 
            -- 获取当前日期往前推1周的年份+两位ISO周数
            LEFT(CONVERT(VARCHAR(10), DATEADD(WEEK, -1, GETDATE()), 120), 4) 
            + RIGHT('0' + CAST(DATEPART(ISOWK, DATEADD(WEEK, -1, GETDATE())) AS VARCHAR(2)), 2)
        -- 可选:处理其他情况,返回默认值
        ELSE NULL 
    END AS TargetWeek
FROM [BI_Planning].[dbo].[tblPlanning]

关键细节解释

  • 日期偏移:DATEADD(WEEK, -2, GETDATE())会把当前日期往前推2周,确保计算的是你需要的This Week -2对应的周数;同理-1对应This Week -1。
  • 年份提取:LEFT(CONVERT(VARCHAR(10), ..., 120), 4)会把日期转成YYYY-MM-DD格式,再截取前4位得到年份。
  • 两位周数:RIGHT('0' + CAST(DATEPART(ISOWK, ...) AS VARCHAR(2)), 2)会给单数字周数补前导零,保证最终拼接的是YYYYWW的格式(比如201805而不是20185)。
  • CASE分支完整:明确区分TRUE和FALSE的分支,加上ELSE处理非预期值,避免返回NULL(如果不需要可以去掉ELSE,默认返回NULL)。

如果你的[This Week -2]字段是布尔类型(不是字符串的'TRUE'/'FALSE'),那需要把判断条件改成WHEN [This Week - 2] = 1(或= 0),根据字段实际类型调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:03