简体   繁体   中英

Using CASE in WHERE clause?

I am getting the following error in my WHERE clause on the very last AND statement AND CAST(cp.EndDate...) . I just added the CASE statement to know if the month is January and to compare the cp.startdate >= value1 OR value 2

Error:

An expression of non-boolean type specified in a context where a condition is expected, near 'and'.

My WHERE clause:

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

Not sure what's wrong... any help in implementing this would be appreciated.

From a pure syntax point of view, you need to compare something to your CASE output. Something like this would be syntactically correct.

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)

Here is the previous question

I think this is what you are looking for:

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

This checks that the cp.startdate is greater than or equal to the first day of the current month in the prior year, and that the cp.enddate is less than or equal to the last day of the current month. Replace GETDATE() with your date of choice.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM