1 CREATE FUNCTION [dbo].[_GetDateInterval] 2 ( 3 @d1 as datetime, 4 @d2 as datetime 5 ) 6 RETURNS nvarchar(100) 7 AS 8 BEGIN 9 --函数默认@d1 <= @d2,如果@d1 > @d2,则交换 10 If @d1 > @d2 11 Begin 12 Declare @d3 as datetime 13 Set @d3 = @d1 14 Set @d1 = @d2 15 Set @d2 = @d3 16 End 17 18 declare @yy as int, @mm as int, @dd as int 19 20 --先直接判断月数,每年的12个月是固定的 21 set @mm = DATEDIFF(MONTH, @d1, @d2) 22 23 --当@d1的日大于@d2+1的日(不到1个月),则月份-1 24 If Day(@d1) > Day(@d2) + 1 25 Begin 26 Set @mm = @mm - 1 27 End 28 29 --将@d1日期直接增加已获得的月数,以便后面直接判断天数 30 set @d1 = DATEADD(MONTH, @mm, @d1) 31 32 --根据@mm,获取年数 33 set @yy = @mm / 12 34 35 --根据@mm,将@mm取余数,获取月数 36 set @mm = @mm % 12 37 38 --获取@dd的天数,此时的@d1已经是接近@d2日期了 39 set @dd = DATEDIFF(DAY, @d1, @d2) + 1 40 41 --将@d1日期增加1个月,并减去1天,判断是否与@d2相同(满月判断) 42 set @d1 = DATEADD(MONTH, 1, @d1) 43 set @d1 = DATEADD(DAY, -1, @d1) 44 45 --如果相同,则表示天数进位(满月),日期进位,月份+1 46 If @d1 = @d2 47 Begin 48 Set @mm = @mm + 1 49 Set @dd = 0 50 End 51 52 --最后也是判断月数是否有进位。判断@mm是否为12(逢12进1),如果是则年份+1,即@yy+1,然后@mm设为0 53 If @mm = 12 54 Begin 55 Set @yy = @yy+1 56 Set @mm = 0 57 End 58 59 Declare @str as nvarchar(100) 60 61 set @str= cast(@yy*12+@mm as varchar(10))+‘,‘+cast(@dd as varchar(10)) 62 63 return @str 64 END 65 66 67 GO