如何取出某段期間的中每個周日的日期

本文將介紹如何取出某段期間的中每個周日的日期。

最近在 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 沒有上限

 

 

 

 

【延伸閱讀】