如何从具有跳跃和非闰年的表中选择日期记录?

时间:2016-10-24 17:52:45

标签: sql sql-server sql-server-2008-r2

如何在非闰年中创建一个忽略2月29日的sql-server查询,并在闰年中包含2月29日。 (假设我在表格中有一个列,例如2000-01-01到2016-12-31的日期)

目前我有这个但它完全消除了闰年。

SELECT uid, CONVERT(DATE,CAST(DATEPART(yyyy,day) AS VARCHAR(4))+'-'+
                CAST([Month] AS VARCHAR(2))+'-'+
                CAST(29 AS VARCHAR(2))) AS code_date, [29] AS code  FROM [data]
                WHERE DATEPART(mm,day) <> 2  AND NOT (ISDATE(CAST(DATEPART(yyyy,day) AS char(4)) + '0229') = 1)

但是,除了闰年之外,我只想在每年的2月29日删除。

2 个答案:

答案 0 :(得分:0)

SQL Server知道闰年是几年:)

select isdate('2/29/2015')
select isdate('2/29/2016')
  

ISDATE 的返回值取决于 SET设置的设置   DATEFORMAT SET LANGUAGE 并配置默认语言Server   配置选项。

Here是告诉您年份是否为闰年的函数:

CREATE FUNCTION dbo.IsLeapYear (@year INT)
RETURNS INT
AS
BEGIN
RETURN(IIF(DATEPART(dd,(EOMONTH(CONCAT(@year,'0201')))) = 29,1,0))
END
GO

您可以创建一个日历表,或在CTE中使用它,如注明HERE

--notice 2/29/2016 but no 2/29/2015
DECLARE @MinDate DATE = '20150201',
        @MaxDate DATE = '20160306';

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

答案 1 :(得分:0)

我终于明白了,这就是答案

SELECT uid, CONVERT(DATE,CAST(DATEPART(yyyy,mydate) AS VARCHAR(4))+'-'+
                CAST([Month] AS VARCHAR(2))+'-'+
                CAST(29 AS VARCHAR(2))) AS code_date, [29] AS code  FROM [data]
                WHERE DATEPART(mm,mydate) <> 2  OR (ISDATE(CAST(DATEPART(yyyy,mydate) AS char(4)) + '0229') = 1)

如果只是日期是闰年,则仅选​​择2月29日,并且在非闰年中不包括2月29日。