変更の始まり

システム期間テンポラル表

システム期間テンポラル・データの照会

システム期間テンポラル表を照会すると、指定した時点または期間の結果を返すことができます。この結果には、現行値とそれまでのヒストリー値が含まれる場合があります。 以下のサンプル照会では、システム期間テンポラル表 (policy_info) に対し てポリシー情報を要求しています。また、関連したヒストリー・テーブル (hist_policy_info) から暗黙的に情報を取得しています。これらのテーブルのレイアウト、および照会でシステム期間テンポラル表の時間基準を指定する方法について詳しくは、「データベース管理」ブックのトピック『システム期間テンポラル・データの照会』を参照してください。

FOR SYSTEM_TIME AS OF を指定した照会。

SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME AS OF '2011-02-28-09.10.12.649592000000'

この照会では、期間の開始列は含まれますが、終了列は含まれません。 開始列値が '2011-02-28-09.10.12.649592000000' 以下で終了列値が '2011-02-28-09.10.12.649592000000' より大きいヒストリー・テーブル行が結果に含まれます。

結果として、DB2 は照会を以下のように書き換えます。
SELECT policy_id, coverage FROM
  (SELECT policy_id, coverage
   FROM policy_info
   WHERE sys_start <= '2011-02-28-09.10.12.649592000000'
   UNION ALL
   SELECT policy_id, coverage
   FROM hist_policy_info
   WHERE sys_start <= '2011-02-28-09.10.12.649592000000'
   AND sys_end > '2011-02-28-09.10.12.649592000000')

FOR SYSTEM_TIME FROM…TO を指定した照会。

SELECT policy_id, coverage, sys_start, sys_end
FROM policy_info
FOR SYSTEM_TIME FROM '0001-01-01-00.00.00.000000' 
                TO '9999-12-30-00.00.00.000000000000'
WHERE policy_id = 'C567'
この照会では、期間の開始列と終了列は含まれません。開始列値が '9999-12-30-00.00.00.000000000000' 未満で、終了列値が '0001-01-01-00.00.00.000000' より大きいヒストリー・テーブル行が結果に含まれます。
結果として、DB2 は照会を以下のように書き換えます。
SELECT policy_id, coverage, sys_start, sys_end FROM
  (SELECT policy_id, coverage, sys_start, sys_end
   FROM policy_info
   WHERE sys_start < '9999-12-30-00.00.00.000000000000'
   AND TIMESTAMP('0001-01-01-00.00.00.000000') <
       TIMESTAMP('9999-12-30-00.00.00.000000000000')
   UNION ALL
   SELECT policy_id, coverage, sys_start, sys_end
   FROM hist_policy_info
   WHERE sys_start < '9999-12-30-00.00.00.000000000000'
   AND sys_end > '0001-01-01-00.00.00.000000')
   AND TIMESTAMP('0001-01-01-00.00.00.000000') <
       TIMESTAMP('9999-12-30-00.00.00.000000000000')
WHERE policy_id = 'C567'

FOR SYSTEM_TIME BETWEEN…AND を指定した照会。

SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME BETWEEN '2011-02-28-09.10.12.649592000000'
                AND '9999-12-30-00.00.00.000000000000'
この照会では、期間の開始列は含まれますが、終了列は含まれません。開始列値が '9999-12-30-00.00.00.000000000000' 以下で終了列値が '2011-02-28-09.10.12.649592000000' より大きいヒストリー・テーブル行が結果に含まれます。
結果として、DB2 は照会を以下のように書き換えます。
SELECT policy_id, coverage, sys_start, sys_end FROM
  (SELECT policy_id, coverage, sys_start, sys_end
   FROM policy_info
   WHERE sys_start <= '9999-12-30-00.00.00.000000000000'
   AND TIMESTAMP('2011-02-28-09.10.12.649592000000') <=
       TIMESTAMP('9999-12-30-00.00.00.000000000000')
   UNION ALL
   SELECT policy_id, coverage, sys_start, sys_end
   FROM hist_policy_info
   WHERE sys_start <= '9999-12-30-00.00.00.000000000000'
   AND sys_end > '2011-02-28-09.10.12.649592000000')
   AND TIMESTAMP('2011-02-28-09.10.12.649592000000') <=
       TIMESTAMP('9999-12-30-00.00.00.000000000000')

CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターを使用して時間基準を指定した照会。

この方法を使用する利点は、時間基準を後から変更でき、SQL を変更する必要がないことにあります。例えば、policy_info に対して、1 年前からの特定の policy_id (C567) のデータを検索する場合を考えます。SYSTIME オプションが YES に設定されている場合、以下のように、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターを設定し、SELECT ステートメントを発行できます。
SET CURRENT TEMPORAL SYSTEM_TIME = CURRENT TIMESTAMP – 1 YEAR;

SELECT policy_id, coverage FROM policy_info
WHERE policy_id = 'C567';
DB2 は、SELECT ステートメントを以下のように解釈します。
SELECT policy_id, coverage FROM policy_info
FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME
WHERE policy_id = 'C567';

この照会では、期間の開始列は含まれますが、終了列は含まれません。開始列値が CURRENT TEMPORAL SYSTEM_TIME 以下で終了列値が CURRENT TEMPORAL SYSTEM_TIME より大きいヒストリー・テーブル行が結果に含まれます。

結果として、DB2 は照会を以下のように書き換えます。
SELECT policy_id, coverage FROM
  (SELECT policy_id, coverage
   FROM policy_info
   WHERE sys_start <= CURRENT TEMPORAL SYSTEM_TIME
   UNION ALL
   SELECT policy_id, coverage
   FROM hist_policy_info
   WHERE sys_start <= CURRENT TEMPORAL SYSTEM_TIME
   AND sys_end > CURRENT TEMPORAL SYSTEM_TIME)
WHERE policy_id = 'C567';
変更の終わり