在T SQL(MS-SQL Server)中的两个日期之间获得分数差异(YEARS)

时间:2016-09-14 12:10:04

标签: sql sql-server

简单的问题:我需要检测两个日期之间的差异,这样当Date_1 = 12-jan-2010Date_2 = 01-jan-2016时,我会获得6但是数字< 6。

SELECT DATEDIFF(YEAR,'12-jan-2010','01-jan-2016')

在上述情况下,DATEDIFF返回6.

任何建议都将受到高度赞赏。

由于

4 个答案:

答案 0 :(得分:0)

这取决于所需的精度,请尝试以下操作:

SELECT DATEDIFF(DAY, @d1, @d2)/365.25

答案 1 :(得分:0)

我想这会解决,

    DECLARE @STARTDATE DATE='12-jan-2010'
    DECLARE @ENDDATE DATE='01-jan-2016'

    DECLARE @TOTALDAY DECIMAL(18,2)=DATEDIFF(day,@STARTDATE,@ENDDATE)
    DECLARE @AVGYEAR DECIMAL(18,2)= ((365*DATEDIFF(YEAR,@STARTDATE,@ENDDATE))+
    dbo.LEAP_YEAR(@STARTDATE,@ENDDATE))/CONVERT(DECIMAL(18,2),
    DATEDIFF(YEAR,@STARTDATE,@ENDDATE))

    SELECT CONVERT(decimal(18,2),@TOTALDAY/@AVGYEAR) AS DiffDate  ---This will provide you result in decimal

这个日期之间没有闰年的函数。

    ALTER FUNCTION LEAP_YEAR(@START DATE,@END DATE)
    RETURNS INT
    AS BEGIN
        DECLARE @COUNT INT = 0,@Z INT = DATEPART(YYYY,@START)
        DECLARE @X INT =DATEPART(YYYY,@START)
        DECLARE @Y INT =DATEPART(YYYY,@END)

        IF (DATEPART(MM,@START) >2)
        SET @X=@X+1

        IF (DATEPART(MM,@END) <2)
        SET @Y=@Y-1

        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
        RETURN @COUNT
    END

答案 2 :(得分:0)

如果我做对了。只需将DATEDIFF(在这种情况下为6)的结果添加到开始日期(如果它&gt;结束日期然后减去1年,这样你将获得5年的全年:

DECLARE @StartD DATETIME; 
DECLARE @FinalD DATETIME;

SET @StartD = '12-jan-2010';
SET @FinalD = '11-jan-2016';


SELECT DATEDIFF(YEAR,@StartD,@FinalD) 
       - CASE WHEN DATEADD(YEAR,DATEDIFF(YEAR,@StartD,@FinalD),@StartD)>@FinalD 
            THEN 1 ELSE 0 END

答案 3 :(得分:0)

首先,我要感谢那些花时间尝试提供简单可靠解决方案的人。最后,我决定按如下方式解决它:

假设我想知道两个日期之间是否过了@n年,那么:

DECLARE @n        INT      ;
DECLARE @Old_Date DATETIME ;
DECLARE @New_Date DATETIME ;

SET @n        = <some_value> ;
SET @Old_Date = <some_value> ;
SET @New_Date = <some_value> ;

IF (DATEADD(YEAR ,@n , @Old_Date) <= @New_Date)
    SET @Result = 'YES' ;
ELSE
    SET @Result = 'NO' ;

[当然,需要包含检查以验证@Old_Date&lt; @New_Date]

我不能说在所有可能的场景中都可以证明(数学上)这是正确的,但它为我提供了所需的答案。

再次感谢所有人。