2012-02-29 62 views
0

我的示例查詢:如何處理閏年查詢

declare @todaysdate datetime = getdate() 


select * from foo f 
WHERE f.completedt < (CAST(MONTH(@todaysdate) AS VARCHAR) + '/' + CAST(DAY(@todaysdate) AS VARCHAR) + '/' + CAST(f.yr - 1 AS VARCHAR)) 

,如果你看到我使用(yr - 1) where子句中,這是拋出date out of range錯誤2011年,2010年,有什麼好辦法在查詢中檢查閏年並使用正確的日期?

+0

爲什麼不在示例查詢中使用datadd或datediff時,這是您在標題中的含義?按照迭戈的回答,Dateadd會做到這一點......我們在這裏失蹤了什麼? – Chris 2012-02-29 16:14:32

+0

更新的問題。 – 2012-02-29 16:21:28

回答

2

基於在問候對方的回答你的意見怎麼樣沿着這些路線的東西:

DECLARE @testyear INT 
SET @testyear = 2011 

SELECT DATEADD(year, @testyear-DATEPART(YEAR, GETDATE()), GETDATE()) 

的,我們確定,我們多麼希望在輸入中添加或減去bsaed年。

所以你的情況,我認爲這將是:

select * from foo f inner join @yrtable y on f.yr = y.year 
WHERE f.completedt < DATEADD(year, @testyear-DATEPART(YEAR, @todaysdate), @todaysdate) 

(假設我有我的減法周圍以正確的方式)。 :)

+0

謝謝你,我調整了你的解決方案根據我的要求和它的工作,這個討論幫助我瞭解更多比我想要的更多。 – 2012-02-29 16:37:46

+0

酷。很高興你的理解,以及有正確的答案。[插入諺語教人在這裏釣魚] – Chris 2012-02-29 16:55:28

3

嘗試更換年 - 1:

DATEADD(year,-1,yr) 
+0

我的問題是關於閏年的日期,有沒有02/29/2011日期,我想看看是否有很好的方法來檢查這種情況。 – 2012-02-29 16:13:59

+0

@rs .:迭戈的觀點是,如果你做了'SELECT DATEADD(year,-1,GETDATE())',它今天能夠正常工作並給出2011-02-28。您遇到問題的唯一原因是因爲您在代碼中聲稱存在2011-02-29(假定f.completedt是Datetime,因此您的構造字符串被解釋爲日期)。 – Chris 2012-02-29 16:16:49

+0

對不起,我沒有使用dateadd,因爲我可能有隨機年foo表和年表中,我不能使用DateAdd(年-1,getdate()) – 2012-02-29 16:21:03