最近做了一份SQL筆試題,總共包括十多道題,其中最后一道題是要寫(xiě)一個(gè)存儲過(guò)程,輸入為startDate和endDate,輸出為一個(gè)日期列表。
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 |
這樣的需求我在平時(shí)的工作中沒(méi)有遇到過(guò),通過(guò)思考有了一個(gè)思路,后面就照這個(gè)思路寫(xiě)了存儲過(guò)程。
現在手邊有電腦,在SQL Server 2005中驗證了一下當時(shí)的思路,發(fā)現總的方向是對的,但細節上有不少錯。
現在把主要代碼貼在下面,留個(gè)紀念(偷懶不寫(xiě)存儲過(guò)程了,在SQL Server 2005中測試通過(guò)):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 datefrom NumDays; |
其中對兩個(gè)sys.objects進(jìn)行笛卡爾積連接,是為了生成足夠多的行,可以換做sys.columns等大表。如果要生成的日期跨度非常大,可以考慮對3個(gè)表進(jìn)行笛卡爾積。
其中還需要注意的是必須為這些表取別名,我這里用了o1和o2,否則會(huì )報錯。
聯(lián)系客服