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

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

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

01declare @startDate datetime;
02declare @endDate datetime;
03declare @numDays int;
04 
05set @startDate = '2010-01-01';
06set @endDate = '2010-02-01';
07set @numDays = datediff(day, @startDate, @endDate) + 1;
08 
09With 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)
17select
18    convert(varchar(10), dateadd(day, NumDays.n - 1, @startDate), 120) as date
19from
20    NumDays;

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

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

posted @ 2011-09-27 11:35  草珊瑚  阅读(650)  评论(0编辑  收藏  举报