繁体   English   中英

如何在t-sql中计算两个日期之间的of年数?

[英]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)

SQLFiddle演示

希望这也可以。

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处改进

  • 修复了一个错误,该错误与在开始日期不是fe年时的开始日期在2月甚至之后减去-1时有关
  • 同样,底部的-1函数应检查原始开始月份,而不检查更改的1。
 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM