2012-11-01 4 views
-1

SQL에 날짜 목록을 표시해야합니다. 이미 n 개의 숫자 코드에 대해 하나의 행을 가진 입력이 있습니다.SQL의 시작 날짜와 종료 날짜의 날짜 목록 표시

현재 테이블 구조 (일/월/년 형식의 날짜) :

Code FromDate ToDate  Total Days 

1 01/03/2012 04/03/2012 4 
2 01/04/2012 05/04/2012 5 

I 출력을 필요로 :

Code FromDate 

1 01/03/2012 
1 02/03/2012 
1 03/03/2012 
1 04/03/2012 
+1

루프 또는 날짜 조회 테이블을 사용하거나 프런트 엔드에서 사용하십시오. 당신은 그게 효과가 없었던 무엇을 시도 했습니까? –

+1

직접 해봤습니까? 어떤 DB 엔진을 사용하고 있습니까? '총 일 '은 중복되지 않습니까? –

+0

이 절차를 작성할 수 있습니다. – Suranga

답변

2
WITH date_range (calc_date) AS (
    SELECT DATEADD(DAY, DATEDIFF(DAY, 0, '2010-01-13') - DATEDIFF(DAY, '2010-01-01', '2010-01-13'), 0) 
     UNION ALL SELECT DATEADD(DAY, 1, calc_date) 
      FROM date_range 
      WHERE DATEADD(DAY, 1, calc_date) <= '2010-01-13') 
SELECT calc_date 
FROM date_range; 
1

비록 당신에게 외삽 쓰기 코드 날짜 (예 : VikramJainrecursive CTE (SQL Server 용)) CPU가 무겁습니다. 많은 양의 레코드가있는 경우, 많은 시간 범위에 걸쳐 반복적으로 많은 양의 데이터가 생성됩니다. 그리고 데이터를 쿼리 할 때마다이를 수행합니다. 지금까지 가장 효율적인 CPU 효율적인 방법은 단순히 다른 테이블을 만드는 것입니다.

데이터베이스를 차원 테이블과 팩트 테이블로 생각하면 시작 날짜와 종료 날짜는 암시 된 차원 인 Time의 키일뿐입니다. 암시 적이 아니라 명시 적으로 Calendar 테이블을 작성하십시오. 그렇다면 사소한 일입니다 ...

이것은 엄청난 양의 CPU 부하를 줄이고 쿼리를 대폭 간소화합니다.

일단 테이블을 만들면 필요로하는 모든 항목이 포함 된 날짜가 미리 채워지고 많은 지저분한 날짜 조작이 간단한 인덱서 블 조회가됩니다.

심지어 같은 해당 테이블의 메타 데이터를 추가 할 수 있습니다 ..

  • start_of_week
  • start_of_month
  • financial_year
  • 등 등

어떤 사람들은 이것을 비판 부끄러움 같이. 개인적으로 나는 반대를 느낄 :
를 - 그것은 지저분한 날짜를 기반으로 계산
를 캐시 - 그것은 명시 적으로 그것은 심지어는 테라 데이타가 매우 좋은 효과를 사용되는 차원 테이블

를 작성 sys_calendar.calendar은.

관련 문제