生成日期列表的存储过程
2010-08-04
写一个存储过程,输入为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 |
下面是实现这个功能的一个存储过程:
declare @startDate datetime; declare @endDate datetime; declare @numDays int; set @startDate = '2010-01-01'; set @endDate = '2010-02-01'; set @numDays = datediff(day, @startDate, @endDate) + 1; With NumDays as ( select top(@numDays) row_number() over(order by (select 0)) as n from sys.objects o1, sys.objects o2 ) select convert(varchar(10), dateadd(day, NumDays.n - 1, @startDate), 120) as date from NumDays;
其中对两个sys.objects进行笛卡尔积连接,是为了生成足够多的行,可以换做sys.columns等大表。如果要生成的日期跨度非常大,可以考虑对3个表进行笛卡尔积。
其中还需要注意的是必须为这些表取别名,我这里用了o1和o2,否则会报错。
