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
解释您想要做什么。可能有更简单的逻辑。