生成日期列表的存储过程(转)

时间:2021-08-22 14:07:35
http://www.nowamagic.net/database/db_ProcedualToGennerateDateList.php

写一个存储过程,输入为startDate和endDate,输出为一个日期列表。eg:如果startDate='2010-01-01',endDate='2010-02-01',则输出为:

date
2010-01-01
2010-01-02
2010-01-03
2010-01-29
2010-01-30
2010-01-31
2010-02-01

下面是实现这个功能的一个存储过程:

01 declare @startDate datetime;
02 declare @endDate datetime;
03 declare @numDays int;
04  
05 set @startDate = '2010-01-01';
06 set @endDate = '2010-02-01';
07 set @numDays = datediff(day, @startDate, @endDate) + 1;
08  
09 With NumDays as
10 (
11     select top(@numDays)
12         row_number() over(order by (select 0)) as n
13     from
14         sys.objects o1,
15         sys.objects o2
16 )
17 select
18     convert(varchar(10), dateadd(day, NumDays.n - 1, @startDate), 120) as date
19 from
20     NumDays;

其中对两个sys.objects进行笛卡尔积连接,是为了生成足够多的行,可以换做sys.columns等大表。如果要生成的日期跨度非常大,可以考虑对3个表进行笛卡尔积。

其中还需要注意的是必须为这些表取别名,我这里用了o1和o2,否则会报错。