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
在原作者基础上改了一下以适用自己需求。