WHERE子句

时间:2017-05-30 11:07:11

标签: sql sql-server tsql

我正在尝试安排自动任务,该任务将根据当前月份提取数据。棘手的部分是它需要每个月拉出一个奇怪的日期(例如从01.15到02.17)。我已经尝试了以下但是它说我的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'

2 个答案:

答案 0 :(得分:1)

您尝试将case表达式用作流控件(如if..else),但case是一个表达式,这意味着它返回单个标量值,并且不能像这样使用它。它甚至在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.

答案 1 :(得分: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'