現在のタイムゾーンの設定は下記のSQLで確認することができます。
SQL> SELECT dbtimezone FROM dual; DBTIME ------ +00:00
SQL> SELECT sessiontimezone FROM dual; SESSIONTIMEZONE --------------- GMT
上記の「+00:00」と「GMT」はともにグリニッジ標準時で同じ意味です。設定の仕方で表示方法が変わる例として挙げてみました。タイムゾーンはCREATE DATABASE文で設定する、あるいは後述のALTER DATABASE文で変更する際にタイムゾーン名で設定するか、オフセット値で設定するかで変わります。
さて、TIME ZONE情報はどのように表示されるかというと、次のような表示になります。
SQL> SELECT systimestamp FROM dual; SYSTIMESTAMP ------------------------------- 05-05-17 04:26:23.476000 +09:00
右端の「+09:00」がタイムゾーンを表しています。
話が前後しますが、SYSTIMESTAMP関数で取得される情報はサーバの時刻を表していますので、セッション・タイムゾーンやデータベース・タイムゾーンを変更しても変化はありません。これはSYSDATE関数についても同様です。
タイムゾーンは変更できます。現在のタイムゾーンを確認したところ「ああーっまずい! 設計時点のタイムゾーンと違う。全部作り直しだー」とあきらめる前に、以下のALTER文で変更できないかどうか確認してみてください。
データベース・タイムゾーンの変更
通常CREATE DATABASEの際に決定するのですが、条件(注3)を満たす場合はデータベース作成後に変更することも可能です。
SQL> ALTER database SET time_zone = 'US/Arizona';
または、
SQL> ALTER database SET time_zone = '-08:00';
セッション・タイムゾーンの変更
SQL> ALTER session SET time_zone = 'US/Arizona';
または、
SQL> ALTER session SET time_zone = '-08:00';
データベース・タイムゾーン変更の条件
WITH LOCAL TIME ZONE型のデータがデータベース・タイムゾーンに従ってデータを格納しているためです。つまりデータベース・タイムゾーンを変更する場合は、TIMESTAMP
WITH LOCAL TIME ZONE型の列を持つテーブルをすべてDROPするか、TIMESTAMP WITH LOCAL TIME ZONE型の列をすべてDROPしなければなりません。データが0件でもエラーになります……なので、TRUNCATEで手を抜こうとしても駄目ですよ。
また、データベース・タイムゾーンはALTER DATABASE文で変更後にインスタンスを再起動しないと反映されないので注意してください。
参考までに、異なるセッション・タイムゾーンでデータ型が違うと表示がどのように異なるか見ておきましょう。
SQL> SELECT dbtimezone FROM dual; DBTIME ------ +09:00 SQL> SELECT sessiontimezone FROM dual; SESSIONTIMEZONE --------------- +09:00 SQL> CREATE TABLE hogehoge ( 2 c1 timestamp(6) 3 ,c2 timestamp(6) with time zone 4 ,c3 timestamp(6) with local time zone 5 ); Table created. SQL> INSERT INTO hogehoge ( 2 c1 3 ,c2 4 ,c3 5 ) values ( 6 to_timestamp('2005/05/14 12:34:56.123456', 'yyyy/mm/dd hh24:mi:ss.ff') 7 ,to_timestamp('2005/05/14 12:34:56.123456', 'yyyy/mm/dd hh24:mi:ss.ff') 8 ,to_timestamp('2005/05/14 12:34:56.123456', 'yyyy/mm/dd hh24:mi:ss.ff') 9 ); 1 row created. SQL> commit; Commit complete. SQL> SELECT * FROM hogehoge; C1 C2 C3 ------------------------ ------------------------------- ------------------------ 05-05-14 12:34:56.123456 05-05-14 12:34:56.123456 +09:00 05-05-14 12:34:56.123456
同じデータを異なるタイムゾーンで確認すると、リスト5のようになります。
SQL> ALTER session SET time_zone = 'US/Arizona'; Session altered. SQL> SELECT * FROM hogehoge; C1 C2 C3 ------------------------ ------------------------------- ------------------------ 05-05-14 12:34:56.123456 05-05-14 12:34:56.123456 +09:00 05-05-13 20:34:56.123456
C1列(TIMESTAMP型)では、変化がありません。つまり、タイムゾーンの変化が考慮されていないことになります。
C2列(TIMESTAMP WITH TIME ZONE型)も変化がありません。が、そもそもデータとしてタイムゾーンの情報が含まれているため、その評価は可能です。
C3列(TIMESTAMP WITH LOCAL TIME ZONE型)は時刻が変化しています。データベースの処理としてセッション・タイムゾーンを反映して変換されていることが分かります。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.