タイムゾーンデータのエクスポート/インポート
さて、タイムゾーンのイメージがつかめたところで、タイムゾーン情報を含むデータのエクスポート/インポートについて注意点を挙げておきます。特にタイムゾーンが違うデータベースサーバ間でデータをエクスポート/インポートする場合です。
結論をいうと、TIMESTAMP WITH (LOCAL) TIME ZONE型のデータについては問題なくインポートできます。TIMESTAMP型とDATE型のデータももちろん問題なくインポートできます……が、TIMESTAMP型とDATE型は、タイムゾーンをまったく意識しない状態でデータベースに格納されていますので、十分注意しないと、新しいタイムゾーンで旧データベースサーバの時刻を評価してしまうなど、整合性が取れなくなる可能性があります。
TIMESTAMP WITH TIME ZONE型はデータとしてタイムゾーンを保持していますので、タイムゾーンが異なるデータベースサーバにインポートしても、タイムゾーンを踏まえた評価が可能です。
複数の日時データ型が混在しているシステムでは、このあたりに十分注意して運用する必要があります。
さて、今回を含めて3回にわたり、日付とタイムゾーンの演算や操作の方法についてひととおり解説してきました。いかがだったでしょうか。新しいことを覚えなくても「SYSDATEと1/24方式でできるんだから別にいいじゃん」という方もいらっしゃることでしょう。しかし、可読性が上がることのメリットも大きいような気がしますし、何より期間データ型を使った演算はぜひ試していただきたいと思います。
タイムゾーンについては、いますぐ使う必要がないかもしれません。特に海外との連携がそもそもないようであればそれも当然です。ただ、新しいシステムが海外とのデータ連携の可能性がある場合は、あらかじめ対処できるようにしておかないとエクスポート/インポートに限らず、厄介なことになるかもしれません。
日本のタイムゾーン(LMT、JST、CJTの話)
日本国内でシステムの開発をしていると、あまり気にしないことの1つに今回紹介したタイムゾーンがあります。そもそも、広大な国土を持つわけでもなく、一時期よく話題になったサマータイム制度も現時点では存在しないので、当然といえば当然です。
しかし本当に日本のタイムゾーンは1つなのでしょうか?
タイムゾーンには、UTCからのOFFSET時間を示す記述方法と、タイムゾーンの名称で表す方法があります。今回使用した名称としては、GMT(+00:00)、US/Arizona(-08:00)、Japan(+09:00)があります。実はこれらのタイムゾーンの中にも夏時間など複数の時刻を表すものがあり、タイムゾーン名を格納しているビューを検索してみると、1つのタイムゾーンでも複数行検索されてきます。
しかし、日本には現在のところ夏時間はありませんのでいわゆる「JST(Japan Standard Time:日本標準時)」のみですが……と思ったら実は3レコード検索されてしまいました。つまり日本にも複数のタイムゾーンがあるということでしょうか?
SQL> SELECT * FROM v$timezone_names WHERE tzname = 'Japan'; TZNAME TZABBREV -------------------- ---------- Japan LMT Japan JST Japan CJT LMT Local Mean Time JST Japan Standard Time CJT Central Japan Time
「LMT」は地方平均時といえばいいでしょうか。ちなみに、一般に日本のLMTは東京の時刻が使用されているようです。東京のLMTは、9時18分48秒。日本標準時は9時間ちょうどなので、東京の時刻は正確には18分48秒だけ日本標準時からずれていることになります。
JSTはいわずと知れた日本標準時です。これが一般的な日本の基準時刻といっても差し支えないでしょう。
さて、残るは「CJT」です。これは何でしょうか?
実は、日本にも複数のタイムゾーンが存在したことが過去にあるようです。それまでJSTとされていたタイムゾーンがこのときCJTとなりました。「Central Japan Time」の略称で、日本中央時間(もしくは中央日本時間)です。詳しくは述べませんが、このときCJTともう1つ存在したタイムゾーンは明治時代に南西諸島を中心として存在した時間帯で、西部標準時と呼ばれていたようです。こちらは「CST」(China Standard Time)に属していたようです。
後に、この西部標準時(CST)のタイムゾーンは日本では採用されなくなり、また日本のタイムゾーンはCJTから単一のJSTに戻ります。
どうやら、これがv$timezone_namesで「Japan」が複数現れる理由のようです。また、このビューには現れませんが、過去には日本にも夏時間があったとか……。
あまりタイムゾーンを意識することがなかったかもしれませんが、少し注意を払うと、世界が意外に近くにあることをあらためて認識するよい機会になるのではないでしょうか。次回は、集計関数の便利な使い方について紹介します。(次回に続く)
筆者紹介
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.