2010-02-25 70 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