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

