在WHERE子句中使用CASE?

时间:2018-01-04 20:56:56

标签: sql sql-server

我在最后一个AND语句WHERE的{​​{1}}子句中收到以下错误。我刚刚添加CASE语句以了解月份是否为1月并比较cp.startdate> = value1 OR value 2

错误:

  

在预期条件的上下文中指定的非布尔类型的表达式,接近'和'。

我的AND CAST(cp.EndDate...)条款:

WHERE

不确定出现了什么问题......如果有任何帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:3)

从纯语法的角度来看,您需要将某些内容与CASE输出进行比较。这样的东西在语法上是正确的。

WHERE 
(
    CAST(cp.startdate AS DATE) >= CAST(DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, getdate()), 0)) AS DATE) 
    OR 
    CAST(cp.startdate AS DATE) >= CASE 
                                   WHEN DATEPART(month,getdate()) = 1 --month is January
                                      THEN CAST(DATEADD(month, DATEDIFF(month, 0, getdate())-1, 0) AS DATE)
                                      ELSE CAST(DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, getdate()) -1, 0)) AS DATE)
                                    END 
)
    AND CAST(cp.EndDate AS DATE) <= CAST(DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0)) AS DATE)

答案 1 :(得分:3)

Here is the previous question

我认为这就是你要找的东西:

WHERE CAST(cp.startdate AS DATE) >=  CASE WHEN DATEPART(MONTH,GETDATE()) = 1
                                          THEN DATEADD(DAY,1,EOMONTH(GETDATE(),-1))
                                          ELSE DATEADD(YEAR,-1,DATEADD(DAY,1,EOMONTH(GETDATE(),-1)))
                                     END --FirstDayOfCurrentMonthPriorYear
AND CAST(cp.EndDate AS DATE) <= EOMONTH(GETDATE()) --LastDayOfCurrentMonthCurrentYear

检查cp.startdate是否大于或等于上一年当月的第一天,cp.enddate小于或等于当前的最后一天月。将GETDATE()替换为您选择的日期。