none
有没有一中可以求两个日期之间,有几个闰二月的代码呢? RRS feed

  • 问题

  •     有没有一中可以求两个日期之间,有几个闰二月的代码呢?

        试了很久没成功!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年1月17日 7:33

全部回复

  • 请先参考两篇文章:

    http://www.blackwasp.co.uk/SQLIsLeapYear.aspx

    http://stackoverflow.com/questions/16857539/list-of-distinct-years-between-two-dates

    先将 SQL 判断闰年的函数建立起来,再利用两日期查询年份的 SQL 转换成行的方法结合就可以算出来了:

    DECLARE @startdate date
    DECLARE @enddate date
    set @startdate='1990/01/01'
    set @enddate='2014/01/01'
    ; with  CTE as
            (
            select  datepart(year, @startdate) as yr
            union all
            select  yr + 1
            from    CTE
            where   yr < datepart(year, @enddate)
            )
    
    select sum(CAST(r.isLeapYear as int) ) count
    from ( select  dbo.IsLeapYear(yr) isLeapYear
    	   from    CTE
    ) r

    这个最后需要判断前后日期是否有超过与未达闰月日期,这样就完整了。

    2014年1月17日 13:11
  •     谢谢啊!第二个链接打不开!

        我测试了一下您提供的代码,错误如下!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年1月22日 8:14
  • 您好,
    因為沒有該function,

    CREATE FUNCTION DaysInYear (@Year INT)
    RETURNS INT
    AS
    BEGIN
        DECLARE @Jan1 DATETIME
        DECLARE @NextJan1 DATETIME
     
        IF @Year < 1753 OR @Year > 9998
            RETURN -1
     
        SET @Jan1 = dateadd(yyyy, @Year-1900, 0)
        SET @NextJan1 = dateadd(yyyy, 1, @Jan1)
        RETURN datediff(d, @Jan1, @NextJan1)
    END
    go
    
    CREATE FUNCTION IsLeapYear (@Year INT)
    RETURNS BIT
    AS
    BEGIN
        DECLARE @IsLeapYear BIT
         
        IF dbo.DaysInYear(@Year) = 366
            SET @IsLeapYear = 1
        ELSE
            SET @IsLeapYear = 0
         
        RETURN @IsLeapYear
    END


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年1月23日 4:53