如何在sql查询中处理闰年

时间:2012-02-29 16:04:12

标签: .net sql sql-server sql-server-2008 sql-server-2005

我的示例查询:

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))

如果你看到我在where子句中使用(yr - 1)并且这会导致2011年,2010年出现date out of range错误,有没有一种方法可以检查查询中的闰年并使用正确的日期?< / p>

3 个答案:

答案 0 :(得分:3)

尝试用以下方式替换yr - 1:

DATEADD(year,-1,yr )

答案 1 :(得分:2)

根据您对其他答案的评论,如何处理这些问题:

DECLARE @testyear INT
SET @testyear = 2011

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

我们正在确定我们想要在输入中添加或减去多少年份。

所以在你的情况下,我认为它会是:

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

(假设我的减法方法正确)。 :)

答案 2 :(得分:0)

如果您想确定年份是否为闰年,那么此代码可以帮助您。

DECLARE 
   year integer := 2021; 
BEGIN 
   if((year mod(4) = 0) and (year mod(100) != 0) or (year mod(400) = 0)) then 
   dbms_output.put_line('Leap year');
   else
   dbms_output.put_line('not Leap year');
   end if;
   dbms_output.put_line('end');
END; 

参考它并在代码中进行所需的修改