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,否则会报错。