2017-06-21 81 views
1

我已经创建了一份报告,应该查看我们教会在部门年份的洗礼次数。该部门的年份从8月1日至7月31日。我现在有报告会告诉我洗礼日期大于8/1/2016的任何人的姓名。但我需要每年更换一年,以便它能够正确报告。所以我想用一个Case语句有它每年更新,但我与此收到错误消息:(错误是在where子句中,所以我并没有包括整个报表)报告每年更新

WHERE (P.organization_id = 1) AND 
((CandidateProcesses_BaptismDate68.datetime_value) between (
case 
When datepart(month, getdate()) < 8 then ('8/1/'+ datepart(year, getdate())) 
When datepart(month, getdate()) >7 then ('8/1/'+ 
datepart((year,getdate())-1))End) and Getdate()) 

有没有人知道我为什么会遇到错误? 谢谢!

+1

我用SQL Server标记,因为代码显然是SQL Server。如果这不是你正在使用的数据库,那么你有一个SQL方言问题。 –

+0

什么是错误信息? 'WHERE'条款中的Case语句? – TheEsnSiavashi

+0

是的,它是SQL Server。 –

回答

0

尝试添加字符串和数字时出现错误。您可以使用datename()而不是datepart()修复此问题。但是,我认为这是一个简单的方法:

WHERE (P.organization_id = 1) AND 
     year(dateadd(month, -7, CandidateProcesses_BaptismDate68.datetime_value)) = year(dateadd(month, -7, getdate())) 

该减7个月〜获得“卫生部年”,然后进行比较,为当前日期减去七个月。也就是说,它会减去7个月,然后在日历年正常化。

这比您的版本贵一点,因为它不能使用CandidateProcesses_BaptismDate68(datetime_value)上的索引。然而,我怀疑洗礼的数据库是如此之大,以至于查询将花费很长的时间。 (如果这是一个问题,那么你的版本可以做一些简单的修改。)

+0

这似乎奏效了!这给了我与8/1/2016和getdate之间的硬编码日期相同的结果。我想我会确定它是否在2017年8月1日之后按照我们的愿望工作。 :) –