DB2 のテンポラル表が勝手にデータを作ってくれて面白い #2

昨日の続き。

期間を考慮してUPDATEだけで行が増えたのはわかった。しかしこれはどう使えば良いのか?

ある特定の時間を狙って照会をする「タイムトラベル照会」という機能があるのでコイツが活躍をする。

■時間ベースの検索

DB2 が時間を認識しているので、時間をそえて SELECT すれば、その時間の値を選んで出してくれる。元のテーブルはコレ。

db2 => SELECT * FROM travel ORDER BY bus_start ;
  
TRIP_NAME            DESTINATION DEPARTURE_DATE PRICE      BUS_START  BUS_END
-------------------- ----------- -------------- ---------- ---------- ----------
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-02-01 2014-03-01
夏の北海道二泊三日   札幌        2014-08-20         45000. 2014-03-01 2014-04-01
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-04-01 2014-08-01
  
  3 レコードが選択されました。

例えば今日時点、2月20日時点での販売価格はいくらだ?

db2 => SELECT price FROM travel FOR BUSINESS_TIME AS OF CURRENT TIMESTAMP
WHERE trip_name = '夏の北海道二泊三日';
  
PRICE
----------
    50000.
  
  1 レコードが選択されました。

なるほど5万円。購入した日に価格を出すときはコレで良いな。今の時間を渡せば、今の時間を含んだ行を返してくれる。

じゃあ、値下げ期間中の3月10日に購入したらいくらになるんだろう。

db2 => SELECT price FROM travel FOR BUSINESS_TIME AS OF '2014-03-10'
WHERE trip_name = '夏の北海道二泊三日';
  
PRICE
----------
    45000.
  
  1 レコードが選択されました。

なるほど4万5千円。ちゃんと時間を認識して行を返してくれる。

■期間の削除もできる

販売手続きの都合で4月29日から5月5日までは販売できなくなる予定となってしまった。この期間の販売はナシということにしたい。なんていう場合。希望の期間だけ DELETE すればいい。

db2 => DELETE FROM travel
FOR PORTION OF BUSINESS_TIME FROM '2014-04-29' TO '2014-05-06'
WHERE trip_name LIKE '夏の北海道二泊三日';
  
db2 => SELECT * FROM travel ORDER BY bus_start;
  
TRIP_NAME            DESTINATION DEPARTURE_DATE PRICE      BUS_START  BUS_END
-------------------- ----------- -------------- ---------- ---------- ----------
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-02-01 2014-03-01
夏の北海道二泊三日   札幌        2014-08-20         45000. 2014-03-01 2014-04-01
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-04-01 2014-04-29
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-05-06 2014-08-01
  
  4 レコードが選択されました。

4月29日から5月5日をうまいこと避けてくれるように行が準備された。

販売してない期間、例えば5月2日の価格を調べてみよう。

db2 => SELECT price FROM travel FOR BUSINESS_TIME AS OF '2014-05-02'
WHERE trip_name = '夏の北海道二泊三日';
  
PRICE
----------
  
  0 レコードが選択されました。

この日は SELECT 結果ナシ。すなわち販売されてないということになった。

面白い機能じゃね?

人事マスタというか組織マスタというか、そういうのを期間付きで格納しとけば、組織変更のある4月以降は新しい組織名で検索できる、みたくできるんじゃないの。同じマスタを使う締め日が違うアプリがあっても(例えば月初3営業日は前月扱いとか)、前月時点での時間をそえてSELECTすれば前月時点での組織で締めができるじゃない。