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

T-SQL中WHERE子句使用CASE表达式报错:Incorrect syntax near '<'

T-SQL中CASE表达式在WHERE子句的语法错误解决方法

你遇到的报错是因为T-SQL的CASE表达式不支持直接返回布尔判断结果,它只能返回数值、字符串这类标量值。你原来的写法里,CASE的THEN/ELSE分支直接写了DATEDIFF(...) <= 31这种比较语句,不符合语法规则,所以触发了"Incorrect syntax near '<'"错误。

针对你的需求(根据OnDate所在月份的天数,判断OnDate与OffDate的天数差是否≤对应阈值),可以用以下两种正确写法:


写法一:用CASE返回允许的最大天数阈值

调整CASE的作用,让它返回对应月份的最大允许天数,再和实际天数差做比较:

SELECT *
FROM TableName CA  -- 这里加上表别名CA,对应原代码里的CA.OnDate,若不需要可去掉
WHERE CStatus = 'Active'
  AND ServiceStatus = 'Active'
  AND DATEDIFF(day, CA.OnDate, CA.OffDate) > 0
  AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= 
      CASE 
          WHEN DAY(EOMONTH(CA.OnDate)) = 31 
              THEN 31 
          ELSE 30 
      END

写法二:用逻辑表达式替代CASE

直接用OR/AND组合逻辑分支,可读性更强:

SELECT *
FROM TableName CA
WHERE CStatus = 'Active'
  AND ServiceStatus = 'Active'
  AND DATEDIFF(day, CA.OnDate, CA.OffDate) > 0
  AND (
      (DAY(EOMONTH(CA.OnDate)) = 31 AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= 31)
      OR
      (DAY(EOMONTH(CA.OnDate)) <> 31 AND DATEDIFF(day, CA.OnDate, CA.OffDate) <= 30)
  )

注意:原代码里的CA.OnDate如果是表别名,记得在FROM子句里给TableName加上别名CA,否则会报错找不到CA对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:08