Sql WHERE子句中的BETWEEN in CASE语句的问题

Sql WHERE子句中的BETWEEN in CASE语句的问题,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试安排自动任务,该任务将根据当前月份提取数据。棘手的是,它需要每个月拉一个奇怪的日期(例如从01.15到02.17)。我试过下面这句话,但它说我的中间陈述有问题 WHERE CASE WHEN DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE() ), 0) = '2017-05' THEN CAST(<here_is_the_date_column>) AS date) BETWEEN '2017-04-23' AND '2017-

我正在尝试安排自动任务,该任务将根据当前月份提取数据。棘手的是,它需要每个月拉一个奇怪的日期(例如从01.15到02.17)。我试过下面这句话,但它说我的中间陈述有问题

WHERE
 CASE WHEN
 DATEADD(MONTH, DATEDIFF(MONTH, 0,  GETDATE() ), 0) = '2017-05'
THEN 
CAST(<here_is_the_date_column>) AS date) BETWEEN '2017-04-23' AND '2017-05-23'
在哪里
当
DATEADD(月,DATEDIFF(月,0,GETDATE()),0)='2017-05'
然后
“2017-04-23”和“2017-05-23”之间

您可以使用复合逻辑表达式,如

WHERE DATEADD(MONTH, DATEDIFF(MONTH, 0,  GETDATE() ), 0) = '2017-05-01'
AND 
CAST(<here_is_the_date_column>) AS date) BETWEEN '2017-04-23' AND '2017-05-23'
其中DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)='2017-05-01'
及
“2017-04-23”和“2017-05-23”之间

您尝试将case表达式用作流控制(如if..else),但case是一个表达式,这意味着它返回单个标量值,不能像这样使用。甚至在报告中也提到:

CASE表达式不能用于控制Transact-SQL语句、语句块、用户定义函数和存储过程的执行流。有关流方法控制的列表,请参阅流语言控制(Transact-SQL)

您需要的是

WHERE  
(
   DATEADD(MONTH, DATEDIFF(MONTH, 0,  GETDATE() ), 0) = '2017-05-01'
   AND CAST(<here_is_the_date_column>) AS date) BETWEEN '2017-04-23' AND '2017-05-23'
)  
OR -- Here comes the part you would use for the `else` part of the case statement.
在哪里
(
DATEADD(月,DATEDIFF(月,0,GETDATE()),0)='2017-05-01'
在“2017-04-23”和“2017-05-23”之间
)  
或者,下面是您将用于case语句的'else'部分的部分。

什么样的日期是“01.15”和“02.17”?请更清楚地说明你想做什么。示例数据和期望的结果会有所帮助。通常最好使用
/
而不是
WHERE
子句中的
case
表达式。WHERE DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)='2017-05'???您不能提供部分日期。您还必须提供一天,例如“2017-05-01”。这就是为什么投了反对票。@RachelAmbler,这是per OP的帖子,而且这不是我回答的重点。你提供了一个答案,结果你的答案是错误的。别怪我,因为你把答案搞错了。如果OP尝试你的答案,他们会得到“从字符串转换日期和/或时间时,转换失败。”因此。答案是为了帮助OP,而不是让他们更加困惑。@RachelAmbler虽然你的评论是正确的,但这还不足以否决答案。我认为我的答案更好,不是因为我已经解决了你正在谈论的问题(公平地说,我只是在读了你的评论后才看到的),而是因为它提供了Rahul答案中缺少的解释。@RachelAmbler,是的,正确的答案是为了帮助而不是填鸭式的。你不应该盲目地复制/粘贴答案。我的回答给出了OP遗漏的正确点