昨日の続き。
期間を考慮して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すれば前月時点での組織で締めができるじゃない。