2017-05-30 99 views
0

我正在尝试计划将根据当前月份提取数据的自动任务。棘手的部分是它需要每个月拉一个奇怪的日期(例如从01.15到02.17)。我已经尝试了下面的内容,但它说我的BETWEEN声明存在问题。WHERE子句中CASE语句中的BETWEEN问题

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' 
+0

什么样的日期是 “01.15” 和 “02.17”?请更清楚你想做什么。样本数据和期望的结果将有所帮助。 –

+0

在'WHERE'子句中使用'AND' /'OR'代替case'_expressions_通常会更好。 – jarlh

回答

1

尝试使用的情况下表达作为流控制(像一个的if..else),但情况是一个表达式,这意味着它返回单个标量值,并且不能像这样使用。甚至在case MSDN page中也有说明:

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

你需要的是andor

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. 
0

可以使用化合物逻辑表达式而不是像

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' 
+1

为什么倒票?!? – jarlh

+2

WHERE DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)='2017-05'?您无法提供部分日期。你还必须提供一天,例如“2017年5月1日”。这就是为什么downvote。 –

+1

@RachelAmbler,这是每个OP的帖子,而且这不是我的答案的要点 – Rahul