[英]how to calculate number of leap years between two dates in t-sql?
我在SSRS中做报告,我需要数据集列来计算t-SQL中两个日期之间的of年数。 我发现单个输入参数的功能无论是否为leap年,但对于我的要求,函数中有两个参数或任何t-SQL语句。
谢谢..等待任何人的回复
DECLARE @year int
SET @year = 2008
if (((@year % 4 = 0) AND (@year % 100 != 0)) OR (@year % 400 = 0))
print 'Leap year'
ELSE
print 'No'
目前尚不清楚您要对第一年和去年做什么,具体取决于日期参数。 这是一个如何使用递归查询的示例:
with cte as
(
select YEAR('1900-01-01') as [year]
union all
select [year] + 1
from cte
where [year] + 1 <= YEAR('2100-01-01')
)
SELECT COUNT(*)
FROM cte WHERE
([YEAR]%4=0) AND (([YEAR]%100<>0) OR ([YEAR]%400=0))
OPTION(MAXRECURSION 1000)
希望这也可以。
DECLARE @X INT = 1590
DECLARE @Y INT = 1603
DECLARE @COUNT INT = 0,@Z INT = @X
WHILE (@X <= @Y)
BEGIN
SET @COUNT = @COUNT +
(CASE WHEN (@X%4 = 0 AND @X%100 !=0) OR @X%400 = 0
THEN 1
ELSE 0 END)
SET @X = @X + 1
END
SELECT @Z BEGIN_YEAR,@Y END_YEAR,@COUNT NO_OF_LEAP_YEARS
结果
我以为,会补充另一个答案。
DECLARE @A DATE = '2008-03-23',
@B DATE = '2012-04-20'
DECLARE @AM INT,@AY INT,@BM INT,@BY INT
SET @AM = DATEPART(MONTH,@A), --3
@AY = DATEPART(YEAR,@A), --2008
@BM = DATEPART(MONTH,@B), --4
@BY = DATEPART(YEAR,@B) --2012
DECLARE @COUNT INT = 0
WHILE (@AY <= @BY)
BEGIN
SET @COUNT = @COUNT +
(CASE WHEN (@AY%4 = 0 AND @AY%100 !=0) OR @AY%400 = 0
THEN 1
ELSE 0 END)
SET @AY = @AY + 1
END
SET @COUNT = @COUNT + CASE WHEN @AM >= 3 THEN -1 ELSE 0 END
SELECT @A BEGIN_DATE,@Y END_DATE,@COUNT NO_OF_LEAP_YEARS
由于我现在没有可用的sql server实例,因此我没有测试代码。.但是您会了解我要实现的目标。 我声明@BM,以防您也想在月底进行检查。
这是一个基于以上答案的sql函数,应该可以执行此操作-
CREATE FUNCTION [dbo].[LeapDayCount]
(
@StartDate as datetime,
@EndDate as datetime
)
RETURNS int as
BEGIN
DECLARE @StartYear int
DECLARE @EndYear int
DECLARE @Year int
SELECT @StartYear = YEAR(@StartDate)
SELECT @EndYear = YEAR(@EndDate)
DECLARE @Count int
SET @Count = 0
SET @Year = @StartYear
WHILE (@Year <= @EndYear)
BEGIN
SET @Count = @Count +
(CASE WHEN (@Year%4 = 0 AND @Year%100 !=0) OR @Year%400 = 0
THEN 1 ELSE 0 END)
SET @Year = @Year + 1
END
--remove one leap day if start date is a leap year but after february
IF ((@StartYear%4 = 0 AND @StartYear%100 !=0) OR @StartYear%400 = 0) AND MONTH(@StartDate) > 2 SET @Count = @Count -1
--remove one leap day if end date is a leap year but less than 29th Feb
IF ((@EndYear%4 = 0 AND @EndYear%100 !=0) OR @EndYear%400 = 0) AND (MONTH(@EndDate) = 1 OR (MONTH(@EndDate) = 2 AND DAY(@EndDate) < 29)) SET @Count = @Count -1
RETURN @Count
END
原始答案的改进
这有2处改进
CREATE FUNCTION riskstore.GetLeapYearCount (@Start Date, @End Date) RETURNS INT AS BEGIN DECLARE @StartMonth INT = DATEPART(MONTH,@Start) DECLARE @StartYear INT = DATEPART(YEAR,@Start) DECLARE @OriginalStartYear INT = DATEPART(YEAR,@Start) DECLARE @EndMonth INT = DATEPART(MONTH,@End) DECLARE @EndYear INT = DATEPART(YEAR,@End) DECLARE @COUNT INT = 0 WHILE (@StartYear <= @EndYear) BEGIN SET @COUNT = @COUNT + (CASE WHEN (@StartYear%4 = 0 AND @StartYear%100 !=0) OR @StartYear%400 = 0 THEN 1 ELSE 0 END) SET @StartYear = @StartYear + 1 END SET @COUNT = @COUNT + CASE WHEN @StartMonth >= 3 AND ((@OriginalStartYear%4 = 0 AND @OriginalStartYear%100 !=0) OR @OriginalStartYear%400 = 0) THEN -1 ELSE 0 END RETURN (@COUNT) END
两个日期之间的leap日数。
DECLARE
@StartDate DATETIME = '2000-02-28',
@EndDate DATETIME = '2017-02-28'
SELECT ((CONVERT(INT,@EndDate-58)) / 1461 - (CONVERT(INT,@StartDate-58)) / 1461)
-58从1900年3月1日开始计数,而/ 1461是2月29日之间的天数。 注意:在Excel中,当1900年1月1日在Excel中是第1天时,-58将是-60,而在SQL中则是第0天,SQL不能识别1900年2月29日,而Excel可以。 还请注意:由于每隔400年跳过skip年,此公式就会每400年出现一次错误。 希望这对某人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.