2012年3月6日 星期二

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

         MSDN上有網友在問,已經有高手利用CTE去解囉,小弟剛好在練習水平思考的技巧,在此提供另一種解法,就是利用SPT_VALUES提取列表去解

        小弟認為使用SPT_VALUES比CTE更直覺的去解這個問題,效能也許第一次不比CTE快,但第二次將SPT_VALUES載入記憶體後,就不輸CTE囉,而且重點是此方法從SQL 2000到SQL 2012 (RC0)都適用

DECLARE @startDate AS DATETIME , @EndDate AS DATETIME
SET @startdate = '20090101'
SET @enddate = '20121231'

SELECT
   DATEADD(dd,NUMBER,@startDate) ,DATENAME(dw,DATEADD(dd,NUMBER,@startDate))
FROM MASTER..SPT_VALUES
WHERE TYPE='P'
   AND DATEPART(dw,DATEADD(dd,NUMBER,@startDate))=1
   AND DATEADD(dd,NUMBER,@startDate)<= @enddate


        注意利用SPT_VALUES提取的數量不能超過2048,因為NUMBER(TYPE='P')的範圍在0-2047
  
        什麼時候會用SPT_VALUES這個呢?通常拿來產生一年的日期列表,或是1000以內的自然數都很方便

0 意見:

張貼留言