ガイド
Oracle Databaseでは、さまざまな場所でタイムゾーンを設定できます。 以下は、Oracleを使用するときにタイムゾーンを変更する4つの方法です。
データベースのタイムゾーンの設定
データベースの作成時にデータベースのタイムゾーンを設定できます。 これを行うには、CREATE DATABASE
文のSET TIME_ZONE
句を使用します。
:
CREATE DATABASE mySampleDb...SET TIME_ZONE='Australia/Sydney';
この場合、タイムゾーンの地域名を使用しました。 システム上の有効な地域名の完全なリストを取得するには、Oracle Databaseで有効なタイムゾーンのリストを返す方法を参照してください。
または、実際のタイムゾーンオフセットを使用することもできます:
CREATE DATABASE mySampleDb...SET TIME_ZONE='+10:00';
データベースの作成時にタイムゾーンを明示的に設定しない場合、デフォルトではサーバーのオペレーティングシステムのタイムゾーンが設定されます。
データベースの現在のタイムゾーン設定を変更することもできます。 これを行うには、ALTER DATABASE
ステートメントを使用します。
:
ALTER DATABASE mySampleDb...SET TIME_ZONE='Australia/Sydney';
データベースのタイムゾーンは、TIMESTAMP WITH LOCAL TIME ZONE
列にのみ関連していることに注意してください。 また、データベースのタイムゾーンをUTC(0)に設定することをお薦めします:00)データ変換を回避し、データベース間でデータを転送するときのパフォーマンスを向上させる。
セッション-タイム-ゾーンの設定
セッション-タイム-ゾーンは、データベース-タイム-ゾーンとは独立して設定できます。 TIMESTAMP WITH LOCAL TIME ZONE
データを返すと、そのデータは現在のセッションのタイムゾーンで返されます。
セッションのタイムゾーンは、TIMESTAMP
値がTIMESTAMP WITH TIME ZONE
またはTIMESTAMP WITH LOCAL TIME ZONE
データ型に変換されたときにも有効になります。
セッションレベルでタイムゾーンを設定するには、いくつかのことを行うことができます。ORA_SDTZ環境変数
セッションのタイムゾーンは、環境変数ORA_SDTZ
を使用して設定できます。 これは、次の値に設定できます:
- オペレーティングシステムのローカルタイムゾーン(
'OS_TZ'
) - データベースのタイムゾーン(
'DB_TZ'
) - UTCからの絶対オフセット(例:
'-04:00'
) - タイムゾーン地域名(例:
'America/St_Kitts'
)
UNIX環境でこの環境変数を設定する例をいくつか示します:
% setenv ORA_SDTZ 'OS_TZ'% setenv ORA_SDTZ 'DB_TZ'% setenv ORA_SDTZ 'America/St_Kitts'% setenv ORA_SDTZ '-04:00'
ORA_SDTZ
変数のデフォルト値は'OD_TZ'
です。 この値は、変数が設定されていない場合、または無効な値に設定されている場合に使用されます。
ALTER SESSION文
特定のSQLセッションのタイムゾーンは、ALTER SESSION
文のSET TIME_ZONE
句を使用して変更できます。
TIME_ZONE
は、以下の値に設定できます:
- セッションが開始されたときの既定のローカルタイムゾーン(
local
) - データベースのタイムゾーン(
dbtimezone
) - UTCからの絶対オフセット(例:
'-04:00'
) - タイムゾーン地域名(例:
'Canada/Eastern'
)
このような値にTIME_ZONE
を設定する例を次に示します:
ALTER SESSION SET TIME_ZONE=local;ALTER SESSION SET TIME_ZONE=dbtimezone;ALTER SESSION SET TIME_ZONE='Canada/Eastern';ALTER SESSION SET TIME_ZONE='-04:00';
SESSIONTIMEZONE
関数で現在のセッションのタイムゾーンを確認できます。
:
SELECT SESSIONTIMEZONE FROM DUAL;
結果:
Australia/Brisbane
私の場合、セッションのタイムゾーンはAustralia/Brisbaneに設定されています。
AT TIME ZONE句
datetime式には、AT LOCAL
句またはAT TIME ZONE
句を含めることができます。 AT LOCAL
句を指定した場合、結果は現在のセッションのタイムゾーンで返されます。 6882>句を指定すると、タイムゾーンは次のいずれかになります:
- タイムゾーンオフセット
- タイムゾーン地域名
-
DBTIMEZONE
(この関数は、データベースのタイムゾーンを返します) -
SESSIONTIMEZONE
(この関数は、現在のセッションのタイムゾーンを返します) - 有効なタイムゾーン形式の文字列を返す式。
:
SELECT FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00') AT TIME ZONE '+12:00'FROM DUAL;
結果:
02/JAN/30 04:30:35.000000000 AM +12:00
この場合、FROM_TZ()
関数を使用して、timestamp値とタイムゾーンをTIMESTAMP WITH TIME ZONE
値に変換しました。 次に、AT TIME ZONE
句を使用して別のタイムゾーンを指定しました。
ここに同じ例がありますが、今回は指定しますAT LOCAL
:
SELECT FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00') AT LOCALFROM DUAL;
検索結果:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE