Sql server 2005 生成日历

Sql server 2005 生成日历,sql-server-2005,tsql,Sql Server 2005,Tsql,如何生成整个范围的日期? 感谢正如Mitch Wheat在他的评论中所建议的那样,提高此查询性能的最佳方法可能是使用一个替代用于生成日期列表的递归CTE 如果您不能或不愿意使用数字表,则可以使用Itzik Ben Gan建议的方法改进日期范围CTE在大范围内的性能: DECLARE @t TABLE(startdate DATETIME , enddate DATETIME) INSERT INTO @t SELECT '8/01/2009','08/31/2009' UNION AL

如何生成整个范围的日期?
感谢

正如Mitch Wheat在他的评论中所建议的那样,提高此查询性能的最佳方法可能是使用一个替代用于生成日期列表的递归CTE

如果您不能或不愿意使用数字表,则可以使用Itzik Ben Gan建议的方法改进日期范围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);

虽然执行计划显示此版本的效率略低于原始版本=~1%,在我的系统上使用SET STATISTICS TIME(设置统计时间)进行测量表明,此版本的运行时间和CPU时间都少于您的一半。

为什么不使用基于集合的数字表方法?@priyanka.bangalore-该技术涉及高效使用CTE生成大范围的数字,而不是具体到日期。我认为它出现在Solid Quality Learning的一本SQLServer2005内部书籍中——我认为是T-SQL编程书-