それは可能ですが、私が恐れている組み込みの方法ではありません。手作業でタイムラインを再構築する必要があります。
変更追跡テーブルがtran_end_timeを提供する場合、これはプロパティの値が永続化されていると認識される時間であるため、テーブル状態のすべての異なる期間をフェッチするクエリを作成し、追跡されたプロパティの変更に参加する必要があります。次にピボットします(テーブルと同じ形式でプレゼンテーションを行うため)。完全を期すために変更/追跡されていない値を取得するには、テーブルの状態自体と結合することを忘れないでください。
簡略化した最終結果は、次のようになります。
RN PK PropA PropB FromDate ToDate
1 1 'Ver1' 'Ver1' 2012-01-01 09:00 2012-01-02 08:00
2 1 'Ver1' 'Ver2' 2012-01-02 08:00 2012-01-03 07:00
3 1 'Ver2' 'Ver2' 2012-01-03 07:00 *getdate()*
4 2 'Ver1' 'Ver1' 2012-01-01 05:00 2012-01-02 06:00
5 2 'Ver1' 'Ver2' 2012-01-02 06:00 2012-01-03 01:00
6 2 'Ver2' 'Ver2' 2012-01-03 01:00 *getdate()*
getdate()は、行が削除されていない場合に有効であることに注意してください。削除されていない場合は、削除日で置き換える必要があります。
編集、2つのユースケース。最初のポイントは簡単に対処できます。これは、時間オブジェクトグラフを作成してからフィルタリングすることです。
declare @pointInTime datetime = '20120102 10:00';
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate
2番目のポイントは、ご指摘のとおり、EXCEPT句を使用して簡単に生成できます。上記のクエリが与えられた場合:
declare @pointInTimeA datetime = '20120102 10:00';
declare @pointInTimeB datetime = '20120103 01:00';
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate
EXCEPT
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate
ただし、このexcept
句は、少なくとも1つの異なる列値を持つ行のみを示します。その情報が人間の目に本当に意味があるかどうかはわかりません。ニーズによっては、データを直接処理するクエリのcdc
方が適切な場合があります。