당신은 실제 날짜 테이블의 성능을 이길 수 있지만, 당신은 단지 활성 또는 비활성 날짜 사이에 약 2000 일 이상 적은을 가지고있는 경우 기본 쿼리가 임시 반대, 다음에 CROSS APPLY
을 고려하지 않아도됩니다 spt_valu es 테이블.
것은 나는 확실하지 이었기 때문에 경우 항상 또는 (활성 비활성 <와 활성> 비활성, 그리고 다른 사람 = 일부의 경우)하기 전에,이 경우 중 하나에 대한 작업을해야 활성 및 비활성 날짜 경우 :
select distinct
loannumber, activedt, inactivedt, dtvalue
from
smd..TABLE_NAME
CROSS APPLY (
SELECT DATEADD(DD, N.number, activedt) FROM spt_values N
WHERE N.number BETWEEN 0 AND DATEDIFF(DD, activedt, inactivedt) AND activedt <= inactivedt
UNION ALL SELECT DATEADD(DD, N.number, inactivedt) FROM spt_values N
WHERE N.number BETWEEN 0 AND DATEDIFF(DD, inactivedt, activedt) AND activedt > inactivedt
) N (dtvalue)
where
loannumber = '12345678'
이 1/3에서 1/5로 단일 레코드 대출 번호에 대한 아래의 결과를 생산 : 2000 이상 취득해야하는 경우
loannumber activedt inactivedt dtvalue
---------- ---------- ---------- ----------
12345678 2017-01-03 2017-01-05 2017-01-03
12345678 2017-01-03 2017-01-05 2017-01-04
12345678 2017-01-03 2017-01-05 2017-01-05
, 적절한 행을 생성하는 UNION ALL
에 추가 기술을 신속가 된 카운트.
예제 데이터 및 원하는 결과는 가정을 줄입니다. –
열에는 여러 값이 들어 있으면 안됩니다. 내가 정말로 원하는 것은 activedt와 inactivedt 사이의 매일 매일의 행입니다. 달력 표가 도움이 될지 모르지만 단순히 그 시절을 원한다면 집계표가 더 나은 접근 방식이 될 것입니다. –