あなたは物理的な日付テーブルのパフォーマンスを打つが、あなただけの非アクティブとアクティブの日付の間で約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/5に1/3から単一のレコードローンの数については、以下の結果をもたらした:あなたが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の間の毎日の行ですか?カレンダーテーブルが役立つかもしれませんが、単にその日が必要な場合は、集計表を使用する方がよいでしょう。 –