SQL Server 两个时间相差几年几月几日

作者:outlela  来源:奶油拌云朵   发布时间:2022-10-20 9:18:30

SQL Server 两个时间相差几年几月几日,一个方法搞定。

IF EXISTS (
              SELECT *
              FROM dbo.sysobjects
              WHERE id=OBJECT_ID(N'[FN_GetDateDiff]')AND((OBJECTPROPERTY(id, N'IsTableFunction')=1)OR(OBJECTPROPERTY(id, N'IsScalarFunction')=1))
          )
    DROP FUNCTION [FN_GetDateDiff];
GO
CREATE FUNCTION [dbo].[FN_GetDateDiff](@d1 DATETIME, @d2 DATETIME)
RETURNS @RES TABLE([Year] INT, [Month] INT, [Day] INT)
AS
    BEGIN
        --函数默认@d1 <= @d2,如果@d1 > @d2,则交换
        IF @d1>@d2
            BEGIN
                DECLARE @d3 AS DATETIME;
                SET @d3=@d1;
                SET @d1=@d2;
                SET @d2=@d3;
            END;

        DECLARE @yy AS INT, @mm AS INT, @dd AS INT;

        --先直接判断月数,每年的12个月是固定的
        SET @mm=DATEDIFF(MONTH, @d1, @d2);

        --当@d1的日大于@d2+1的日(不到1个月),则月份-1
        IF DAY(@d1)>DAY(@d2)+1
            BEGIN
                SET @mm=@mm-1;
            END;

        --将@d1日期直接增加已获得的月数,以便后面直接判断天数
        SET @d1=DATEADD(MONTH, @mm, @d1);

        --根据@mm,获取年数
        SET @yy=@mm / 12;

        --根据@mm,将@mm取余数,获取月数
        SET @mm=@mm % 12;

        --获取@dd的天数,此时的@d1已经是接近@d2日期了
        SET @dd=DATEDIFF(DAY, @d1, @d2);

        --将@d1日期增加1个月,并减去1天,判断是否与@d2相同(满月判断)
        SET @d1=DATEADD(MONTH, 1, @d1);
        SET @d1=DATEADD(DAY, -1, @d1);

        --如果相同,则表示天数进位(满月),日期进位,月份+1
        IF @d1=@d2
            BEGIN
                SET @mm=@mm+1;
                SET @dd=0;
            END;

        --最后也是判断月数是否有进位。判断@mm是否为12(逢12进1),如果是则年份+1,即@yy+1,然后@mm设为0
        IF @mm=12
            BEGIN
                SET @yy=@yy+1;
                SET @mm=0;
            END;

        INSERT @RES(Year, Month, Day)
        VALUES
        (
        @yy , -- Year - int
        @mm , -- Month - int
        @dd -- Day - int
        );
        RETURN;
    END;
GO

调用方法

SELECT * FROM  dbo.FN_GetDateDiff(GETDATE(),'2023-11-30 23:59:59')

结果:

YearMonthDay

1110

image.png

在原作者基础上改了一下以适用自己需求。

*本文最后修改于:2022-10-20 9:26:36
本文标签: SQL Server 时间差 几年 几月 几日
本文链接地址:https://outlela.com/Code/160.html
转载或引用请保留地址并注明出处:outlela.com