2010-02-25 3 views
0

전체 범위의 날짜를 어떻게 만들 수 있습니까? 감사합니다캘린더 생성

+1

왜 세트 기반 숫자 테이블 접근 방식을 사용하지 않으시겠습니까? –

답변

0

Mitch Wheat이 제안한 바와 같이이 쿼리의 성능을 향상시키는 가장 좋은 방법은 날짜 목록을 생성하는 데 사용되는 순환 CTE 대신 numbers table을 사용하는 것입니다. 하다니

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의 성능은 Itzik 벤 웨이 코 뮤니시에서 제안하는 방법을 사용하여 큰 범위에 대한 개선 될 수있다 실행 계획은이 버전이 원본 (= ~ 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 –