繁体   English   中英

在WHERE子句中使用CASE?

[英]Using CASE in WHERE clause?

我在最后一个AND语句AND CAST(cp.EndDate...) WHERE子句中遇到以下错误。 我只是添加了CASE语句以了解月份是否为一月,并比较cp.startdate> = value1或value 2

错误:

在需要条件的上下文中在“和”附近指定的非布尔类型的表达式。

我的WHERE子句:

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

不知道出了什么问题。在实现该功能方面的任何帮助将不胜感激。

从纯粹的语法角度来看,您需要将某些内容与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)

这是上一个问题

我认为这是您要寻找的:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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