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