2017-06-21 120 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日之後按照我們的願望工作。 :) –