1 -- 获取月度列表
2 if exists(select 1 from sysobjects where name = 'proc_GetDateMonthList' and type = 'p')
3 drop proc proc_GetDateMonthList
4 GO
5 create proc proc_GetDateMonthList
6 @BeginDate varchar(6)
7 ,@EndDate varchar(6)
8 ,@Delimiter varchar(1) = ','
9 as
10 /*
11 Create By: www.liuju.net
12 QQ群:327307058
13 Date: 2013-10-09
14 */
15 declare
16 @iBegin int, @iEnd int, @iBeginMon int, @iEndMon int, @iYear int, @iMon int, @iTempYear int, @iTempMon int, @iStart int , @iStop int,
17 @sBeginMon varchar(2), @sEndMon varchar(2), @sResult varchar(8000), @s varchar(6)
18 begin
19 if (LEN(@BeginDate) <> 6) or (LEN(@EndDate) <> 6)
20 begin
21 raiserror('日期格式错误!', 16, 1)
22 return
23 end
24 if (CAST(@EndDate as int) - cast(@BeginDate as int)) < 0
25 begin
26 raiserror('日期范围错误!', 16, 1)
27 return
28 end
29 if @BeginDate = @EndDate
30 begin
31 select @BeginDate
32 return
33 end
34 select @iBegin = SUBSTRING(@BeginDate, 1, 4), @iEnd = SUBSTRING(@EndDate, 1, 4)
35 set @iYear = @iEnd - @iBegin
36 if @iYear < 0
37 begin
38 raiserror('日期范围错误!', 16, 1)
39 return
40 end
41 if @iYear > 90
42 begin
43 raiserror('日期范围错误,最大跨年限度为90年!', 16, 1)
44 return
45 end
46 -- 开始处理
47 set @sResult = ''
48 select @iBeginMon = SUBSTRING(@BeginDate, 5, 2), @iEndMon = SUBSTRING(@EndDate, 5, 2)
49 -- 不跨年
50 if @iYear = 0
51 begin
52 set @iMon = @iEndMon - @iBeginMon
53 if @iMon > 0
54 begin
55 set @sResult = @BeginDate
56 set @iTempMon = 0
57 while @iTempMon < @iMon - 1
58 begin
59 set @s = CAST(@BeginDate as int) + 1
60 set @sResult = @sResult + @Delimiter + @s
61 set @iTempMon = @iTempMon + 1
62 end
63 set @sResult = @sResult + @Delimiter + @EndDate
64 end
65 end
66 -- 跨年
67 if @iYear > 0
68 begin
69 -- 从开始到结束,每次+1,当月份 > 12 年度进1,月度归1
70 select @iStart = @BeginDate, @iStop = @EndDate
71 while @iStart <= @iStop
72 begin
73 select @iTempYear = SUBSTRING(convert(varchar(6),@iStart), 1, 4), @iTempMon = SUBSTRING(convert(varchar(6),@iStart), 5, 2)
74 if @iTempMon > 12
75 begin
76 set @iStart = (@iTempYear + 1)*100 + 1
77 end
78 set @s = CONVERT(varchar(6), @iStart)
79 --整合结果
80 if LEN(@sResult) = 0
81 set @sResult = @s
82 else
83 set @sResult = @sResult + @Delimiter + @s
84 set @iStart = @iStart + 1
85 end
86 end
87 select @sResult
88 end
89 GO
90
91 -- Test
92 exec proc_GetDateMonthList '201210', '201512'