はじめに
「18分59秒をめぐって日本標準時の歴史をひもとくことに」を読みまして、Oracle Databaseで東京の地方時(LMT)が表示できるかどうかを試しました。ついでに日本の夏時間対応も試しています。
Oracle Databaseとタイムゾーン
Oracle Databaseは9i R1以降タイムゾーンのハンドリングが可能になっています。
利用可能なタイムゾーンはIANAのTime Zone Databaseを元にしており、ここに記載されているLMTにも対応しています。
ただし、Oracle Databaseが対応している時差の精度は分までです(マニュアルに明記されていない模様ですが、時差の時間部分、分部分を表す書式があるのに、秒部分を表す書式がない点からの推測となります)。東京の地方時はTime Zone Database上は+9:18:59ですが、+9:18がOracle Databaseとしての精度になります。
実際に試してみる
検証環境はOracle Database 12.1.0.2 Enterprise Edition(検証に関係ないけどExadata)です。
まず、今年の日付を表示させます。下記例のように、AT TIME ZONE句にてリージョン名もしくは時差の絶対値(+9:00など)を指定することで、指定したタイムゾーンに変換することが可能です。
SQL> select to_char(to_timestamp_tz('20180801 UTC', 'yyyymmdd tzr') at time zone 'Asia/Tokyo', 'yyyy/mm/dd hh24:mi:ss tzr tzd') from dual;
TO_CHAR(TO_TIMESTAMP_TZ('20180801UTC','YYYYMMDDTZR')ATTIMEZ
-----------------------------------------------------------
2018/08/01 09:00:00 Asia/Tokyo JST
UTC時間を日本時間に変換しました。9時間プラスされています。
では東京の地方時が採用されている期間となる、1887年8月1日だとどうなるかを試してみます。
SQL> select to_char(to_timestamp_tz('18870801 UTC', 'yyyymmdd tzr') at time zone 'Asia/Tokyo', 'yyyy/mm/dd hh24:mi:ss tzr tzd') from dual;
TO_CHAR(TO_TIMESTAMP_TZ('18870801UTC','YYYYMMDDTZR')ATTIMEZ
-----------------------------------------------------------
1887/08/01 09:18:00 Asia/Tokyo LMT
きちんと+9:18となっています。
JSTではなくLMTとなっていることも確認できます。
おまけ:日本の夏時間への対応
Wikipediaにあるように、過去日本でも夏時間が採用されていた時期があります。ここまでの説明で、これにも対応できることは想像がつくかと思いますが、実際に試してみます。
SQL> select to_char(to_timestamp_tz('19500801 UTC', 'yyyymmdd tzr') at time zone 'Asia/Tokyo', 'yyyy/mm/dd hh24:mi:ss tzr tzd') from dual;
TO_CHAR(TO_TIMESTAMP_TZ('19500801UTC','YYYYMMDDTZR')ATTIMEZ
-----------------------------------------------------------
1950/08/01 10:00:00 Asia/Tokyo JDT
夏時間の1時間が更に加算されていることが確認できます。
JSTではなくJDTとなっていることも確認できます。