2010-02-25 71 views
0

如何生成整個範圍的日期? 謝謝生成日曆

+1

爲什麼你不想使用基於集合的數字表方法? – 2010-02-25 05:49:59

回答

0

由於米奇小麥的建議是他的評論,可能提高此查詢性能的最佳方法是使用numbers table代替用於生成日期列表的遞歸CTE。

DECLARE @t TABLE(startdate DATETIME , enddate DATETIME) 
INSERT INTO @t 
    SELECT '8/01/2009','08/31/2009' UNION ALL 
    SELECT '2/01/1900','02/28/1900' UNION ALL 
    SELECT '10/01/1959','10/31/1959' 

DECLARE @n INT 
SET @n = DATEDIFF(dd,'19000201','20090831') + 1 

;WITH base 
AS 
( 
     SELECT 1 AS n 
     UNION ALL 
     SELECT n+1 FROM base 
     WHERE n < CEILING(SQRT(@n)) 
) 
,cross_cte 
AS 
( 
     SELECT 0 AS c 
     FROM base AS b1 
     ,base AS b2 
) 
,dates_cte 
AS 
(
     SELECT TOP(@n) CAST('19000201' AS DATETIME) - 1 + ROW_NUMBER() OVER(ORDER BY c) AS date 
     FROM cross_cte 
) 
SELECT DISTINCT d.DATE     
FROM Dates_Cte d 
JOIN @t t 
ON d.DATE BETWEEN t.startdate AND t.enddate 
OPTION (MAXRECURSION 0); 

雖然:

如果你不能或者不願意使用一個數字表,日期範圍CTE的性能可以使用由伊茨克奔甘建議的方法大範圍提高執行計劃顯示此版本效率略低於原始版本(=〜1%),在我的系統上使用SET STATISTICS TIME進行測量顯示此版本的已用時間和CPU時間均小於您的一半。

+0

@ priyanka.bangalore - 該技術涉及有效地使用CTE生成大範圍的數字,而不是專門針對日期。我認爲它出自Solid Quality Learning的「Inside SQL Server 2005」書籍之一 - 我認爲T-SQL編程之一 - http://www.amazon.co.uk/gp/product/0735621977 – 2010-02-25 09:51:28