本文將介紹如何取出某段期間的中每個周日的日期。
最近在 MSDN 論壇上有朋友提出如何查出某段期間的每一個周日,筆者以 while 迴圈搭配 DATENAME 函數,並將屬於週日的日期 以table 變數儲存,程式碼如下:
1: declare @sd datetime = '20090101'
2: declare @dd datetime = '20121231'
3: declare @t table (c1 datetime)
4:
5: while @sd <= @dd
6: begin
7: if DATENAME(weekday,@sd) = '星期日'
8: insert into @t values (@sd)
9: set @sd = DATEADD(day,1,@sd)
10: end
後來有網友 TerryTasi 利用 CTE 方式遞迴來達到相同目的,完全不需要用到暫存資料表或變數,比筆者的方式高級多了特此紀錄一下,之後再遇到類似問題或許也可以用這種方式來解決。程式碼如下:
1: DECLARE @startDate AS datetime , @EndDate AS datetime
2: SET @startdate = '20090101'
3: SET @enddate = '20121231'
4:
5: ;
6: WITH CTE AS
7: (
8: SELECT
9: -- 找出起始日期最近的星期日
10: DATEADD(dd , (7 - DATEPART(dw,@startdate) + 1 ) % 7 , @startdate) AS Date
11: UNION ALL
12: SELECT
13: -- 加一個禮拜跑 CTE
14: DATEADD(wk,1,Date)
15: FROM CTE
16: WHERE DATEADD(wk,1,Date) < @enddate -- CTE 終止條件
17: )
18: SELECT
19: Date AS [日期] ,
20: DATENAME(dw,Date) AS [星期幾]
21: FROM CTE
22: OPTION (MAXRECURSION 0) -- 讓 CTE 沒有上限
【延伸閱讀】