Oracle Time Zone
あなたがどこにいるのか知っていると思ったとき、Oracleはタイムゾーンを実装して私たちを完全にゾーン化しました。 一緒に来て、私たちがこの偉大な惑星のどこにいるのかを考えてみましょう。
いくつかの記事では、DATEデータ型とTIMESTAMPデータ型の比較について書いています。 この記事では、さらに一歩進んで、TIMESTAMPデータ型のOracleのタイムゾーン機能について説明します。 特に、OracleはTIMESTAMPデータ型に「WITH TIME ZONE」および「WITH LOCAL TIME ZONE」を追加しました。
有効なタイムゾーン
データベースが属するタイムゾーンを設定するときには、二つのオプションがあります。 ‘Hh:mm’の形式でGMT/UTCからの変位として修飾するか、V TIM TIMEZONEテーブルにエントリを持つ名前として指定することができます。 リスト1は、有効なタイム-ゾーン名を山岳標準タイム-ゾーンに表示するために使用したSQLを示しています。
リスト1
MSTの有効なタイム-ゾーン名を表示する
SQL> select tzname,tzabbrev from V$TIMEZONE_NAMES where tzabbrev = 'MST'TZNAME TZABBREV------------------------- ----------America/Denver MSTAmerica/Edmonton MSTAmerica/Ensenada MSTAmerica/Mazatlan MSTAmerica/Mexico_City MSTAmerica/Phoenix MSTAmerica/Regina MSTAmerica/Shiprock MSTAmerica/Tijuana MSTCanada/East-Saskatchewan MSTCanada/Mountain MSTCanada/Saskatchewan MSTEurope/Moscow MSTMexico/BajaNorte MSTMexico/BajaSur MSTMexico/General MSTMST MSTMST7MDT MSTNavajo MSTUS/Arizona MSTUS/Mountain MSTW-SU MST
タイムゾーンの中核となるDBTIMEZONE
はデータベースのタイムゾーンです。 データベースの作成時に選択されたタイムゾーンを確認するには、リスト2のSQLを発行します。 DBTIMEZONEを変更する場合は、リスト3のようにALTER DATBASEコマンドを発行する必要があります。 新しいDBTIMEZONEを有効にするには、データベースをバウンスする必要があります。 さらに、TIMESTAMP with TIME ZONEが定義されているデータ型の列がある場合、DBTIMEZONEをリセットすることはできません。 データベースをバウンスした後、リスト4のSQLを発行して、変更が行われたことを検証できます。 “Hh”に戻したい場合は、”hh”を”hh”に戻します。:dbtimezoneのmm”形式は、リスト5のSQLを発行するだけです。
リスト2
データベースのタイムゾーンを確認する
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
リスト3
データベース-タイム-ゾーンの変更
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
リスト4
DBTIMEZONEの変更を検証する
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
リスト5
DBTIMEZONEをhh:mm形式に戻す
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
データベースのタイムゾーンを使用しない場合は、セッション-レベルでタイムゾーンを設定するオプションが用意されています。 接続している現在のセッションに別のタイムゾーンが必要な場合は、リスト6のSQLを発行します。 セッション-タイム-ゾーンを確認するには、リスト7のSQLを発行します。
リスト6
セッション-レベルでタイム-ゾーンを設定する
SQL> alter session set TIME_ZONE='-03:00';Session altered.
リスト7
セッション-レベル-タイム-ゾーンのチェック
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
現在のシステムの日付と時刻を取得するためにSYSDATEを呼び出すのと同じように、現在のシステムの日付、時刻、およびタイムゾーンを取得するための 返されるデータ型はTIMESTAMP WITH TIME ZONEです。 リスト8のSQLを発行して、現在のシステム時刻情報を取得します。
リスト8
現在のシステム-タイム-タイム-ゾーン情報を取得する
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
セッションの現在の日付と時刻のSYSTIMESTAMP関数のカウンタ部分は、CURRENT_TIMESTAMP関数呼び出しです。 これは、セッションの現在のタイムスタンプがセッションのタイムゾーン(SESSIONTIMEZONE)に関連しているものを返します。 したがって、リスト6で定義されているセッション-タイム-ゾーンがある場合は、リスト9でSQLを発行することでセッションのタイム-スタンプをチェ
リスト9
セッションのローカル-タイムスタンプ
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
タイム・ゾーン情報を含むTIMESTAMPデータ型
表内にタイム・ゾーン情報を格納するために、OracleではTIMESTAMPデータ型を定義しています。 これは、古いDATEデータ型に、日付と時刻の情報だけでなく、小数部の秒も保持するより詳細なメカニズムを与えるためのOracleの大きな新しい希望です。 このdatabtypeの説明については、OracleのDATEデータ型とTIMESTAMPデータ型の比較を参照してください。 この記事の残りの部分と、TIMESTAMPデータ型のタイムゾーンオプションを利用する目的で、表1に定義されているようにテーブルを作成しました。 リスト10では、TIMESTAMP WITH TIME ZONEデータ型とTIMESTAMP WITH LOCAL TIME ZONEデータ型が情報の格納に使用されたときにどのように動作するかの簡単な例を作成しました。 まず、DBTIMEZONEとSESSION TIMEZONEを同じ値’-07:00’に設定しました。 次に、システムタイムスタンプの値をDATE_TABLEに挿入します。 次に、現在のセッションのタイムゾーンを’-03:00’に変更します。 これにより、現在のセッションがデータベースのタイムゾーンの4時間前に設定されます。 次に、現在のセッションのタイムスタンプを保持する行をDATE_TABLEに挿入します。 ここで理解すべき主な考え方は、データ型TIMESTAMP WITH TIME ZONEを持つ列に、INSERT文から指定された明示的な時刻が格納されて表示されることです。 TIMESTAMP WITH LOCAL TIME ZONEデータ型の列には、指定された明示的な時刻が格納されますが、現在のセッションのタイムゾーンに対する相対的な値が表示されます。 つまり、タイムゾーン情報を格納したハードで高速なタイムスタンプが必要な場合は、TIMESTAMP WITH TIME ZONEデータ型を使用する必要があります。 異なるタイムゾーンの顧客に日付と時刻の情報を提供し、現地時間で表現することにもっと関心がある場合は、TIMESTAMP WITH LOCAL TIME ZONEデータ型を使用する必要があります。
表1:
異なるタイムスタンプ列を持つ表の作成
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
リスト10
SYSTIMESTAMPをDATE_TABLEに挿入する
SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -07:00SQL> insert into date_table values (SYSTIMESTAMP,SYSTIMESTAMP);1 row created.SQL> alter session set time_zone='-03:00';Session altered. SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -03:00SQL> insert into date_table values (LOCALTIMESTAMP,LOCALTIMESTAMP );1 row created.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-03 02.57.36.642000 PM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-03 02.57.48.549000 PMSQL> alter session set time_zone='-07:00';Session altered.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-0310.57.36.642000 AM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-0310.57.48.549000 AM
私たちはすべて成長し、タイムゾーンを受け入れました。 誰かに電話をかけたり、別のタイムゾーンに旅行したりするとき、私たちの頭の中で時間差をするのはいつも簡単でした。 何らかの理由で、GMT/UTCのオフセットによるタイムゾーンの実装は、私が概念化し、それが本当にどこで何時であるかを把握することを困難にしました。 私はあなたがこの機能とあなたが地球上のどこにいるのかを知ることができるように、私があなたに与えた例で遊んでいることをお勧めします。
“コラムニストJames Koopmannによるすべての記事を見る