2012-02-29 65 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