Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql WHERE子句中的用例?_Sql_Sql Server - Fatal编程技术网

Sql WHERE子句中的用例?

Sql WHERE子句中的用例?,sql,sql-server,Sql,Sql Server,我在最后一条语句的WHERE子句中遇到以下错误,语句和CAST(cp.EndDate…)。我刚刚添加了CASE语句,以了解月份是一月,并比较cp.startdate>=value1还是value2 错误: 在预期条件的上下文中指定的非布尔型表达式,靠近“and” 我的WHERE子句: WHERE (CAST(cp.startdate AS DATE) >= CAST(DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, getdat

我在最后一条语句的
WHERE
子句中遇到以下错误,语句
和CAST(cp.EndDate…
)。我刚刚添加了CASE语句,以了解月份是一月,并比较cp.startdate>=value1还是value2

错误:

在预期条件的上下文中指定的非布尔型表达式,靠近“and”

我的
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
在哪里
(CAST(cp.startdate作为日期)>=CAST(DATEADD(year,-1,DATEADD(month,DATEDIFF(month,0,getdate()),0))作为日期)
或者——当前月初一
案例
当DATEPART(month,getdate())=1时——month是一月
然后强制转换(DATEADD(month,DATEDIFF(month,0,getdate())-1,0)为日期--LastMonthPrioryear的第一天
ELSE将DATEADD(年份,-1,DATEADD(月份,DATEDIFF(月份,0,getdate())-1,0))转换为日期--LastMonthPrioryEAR的第一天
(完)

和CAST(cp.EndDate AS DATE)从纯语法的角度来看,您需要将一些内容与您的
大小写
输出进行比较。这样的东西在语法上是正确的

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)
在哪里
(
CAST(cp.startdate AS DATE)>=CAST(DATEADD(year,-1,DATEADD(month,DATEDIFF(month,0,getdate()),0))AS DATE)
或
铸造(cp.起始日期为日期)>=案例
当DATEPART(month,getdate())=1时——month是一月
然后强制转换(DATEADD(month,DATEDIFF(month,0,getdate())-1,0)为日期)
ELSE将日期添加(年-1,日期添加(月,日期差异(月,0,getdate())-1,0))转换为日期)
结束
)

和CAST(cp.EndDate AS DATE)从纯语法的角度来看,您需要将一些内容与您的
大小写
输出进行比较。这样的东西在语法上是正确的

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)
在哪里
(
CAST(cp.startdate AS DATE)>=CAST(DATEADD(year,-1,DATEADD(month,DATEDIFF(month,0,getdate()),0))AS DATE)
或
铸造(cp.起始日期为日期)>=案例
当DATEPART(month,getdate())=1时——month是一月
然后强制转换(DATEADD(month,DATEDIFF(month,0,getdate())-1,0)为日期)
ELSE将日期添加(年-1,日期添加(月,日期差异(月,0,getdate())-1,0))转换为日期)
结束
)
和演员(cp.EndDate作为日期)

我想这就是你想要的:

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
WHERE CAST(cp.startdate AS DATE)>=DATEPART(MONTH,GETDATE())=1时的大小写
然后添加日期(天,1,月(GETDATE(),-1))
ELSE DATEADD(年-1,日期add(天,1,月(GETDATE(),-1)))
结束—当前月份的第一天
和演员(cp.EndDate作为日期)

我想这就是你想要的:

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
WHERE CAST(cp.startdate AS DATE)>=DATEPART(MONTH,GETDATE())=1时的大小写
然后添加日期(天,1,月(GETDATE(),-1))
ELSE DATEADD(年-1,日期add(天,1,月(GETDATE(),-1)))
结束—当前月份的第一天

和CAST(cp.EndDate AS DATE)通常最好在WHERE子句中使用AND/OR结构而不是大小写表达式<代码>其中
语句必须包含布尔表达式。您的
CASE
语句不返回布尔值。当然,您可以在
WHERE
语句中使用
CASE
。请参阅:您希望返回条件为true的行。您的第一个比较值A大于或等于B,将返回true或false。但是CASE语句返回一个日期。我怀疑您实际上想要将startdate与CASE语句返回的日期进行比较。另外:
CAST(DATEADD(month,DATEDIFF(month,0,@dt)-1,0)AS date)
的计算结果为
--lastmount的firstday
,而不是
--lastmonthprioryear的firstday
解释您想要做什么。可能有更简单的逻辑。通常最好在WHERE子句中使用AND/OR结构而不是大小写表达式。错误消息非常明显<代码>其中
语句必须包含布尔表达式。您的
CASE
语句不返回布尔值。当然,您可以在
WHERE
语句中使用
CASE
。请参阅:您希望返回条件为true的行。您的第一个比较值A大于或等于B,将返回true或false。但是CASE语句返回一个日期。我怀疑您实际上想要将startdate与CASE语句返回的日期进行比较。另外:
CAST(DATEADD(month,DATEDIFF(month,0,@dt)-1,0)AS date)
的计算结果为
--lastmount的firstday
,而不是
--lastmonthprioryear的firstday
解释您想要做什么。可能有更简单的逻辑。