Oracleデータベースで異なるタイムゾーンの日時を設定したり取得する方法です。データベースのタイムゾーンとは異なるタイムゾーンの日時を取得したい場合に非常に便利です。例えばデータベースは日本時間で構築されているが、アメリカ・ニューヨークの時間を取得したい場合などに便利です。ここではデータベースの設定やOSの設定を変更せずに、データベース・セッションの任意のタイムゾーンの日時を取得する方法を解説します。
現在のセッションのタイムゾーンを確認する方法
現在のセッションで設定されているタイムゾーンを取得するには、次のSQLで確認することが出来ます。
SELECT SESSIONTIMEZONE FROM DUAL;
このSQLを実行することで、現在のセッションで設定されているタイムゾーンを取得することが出来ます。ここでは「+09:00」と表示されており、日本標準時が取得できていることが分かります。
SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
----------------
+09:00
実際に現在の日時を取得するSQLを実行すると、日本時間の日時が取得できていることが分かります。CURRENT_TIMESTAMPを使うと、タイムゾーン情報も表示されます(+09:00)。
-- 日時を分かりやすい表記に変更
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SQL> SELECT CURRENT_DATE FROM DUAL;
CURRENT_DATE
-------------------
2025-07-19 14:26:44
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
-------------------------------
25-07-19 14:24:18.346491 +09:00
なお、SYSDATEやSYSTIMESTAMPだと、OSのタイムゾーンを利用してしまいますので、ここでセッションでタイムゾーンを変更した場合には、CURRENT_DATEまたはCURRENT_TIMESTAMPを使うようにして下さい。
セッションのタイムゾーンを変更する方法
セッションのタイムゾーンを変更するには、次のようにALTER SESSION SET TIME_ZONE = ‘タイムゾーン’;というSQLを実行します。「タイムゾーン」には、設定したいタイムゾーンの名前や世界標準時からの差を設定します。
ALTER SESSION SET TIME_ZONE = 'タイムゾーン';
例えばアメリカ・ニューヨークのタイムゾーンを設定する場合は次のようにします。「America/New_York」または「-05:00」を設定することによって、セッション中のタイムゾーンをアメリカ・ニューヨークに設定することが出来ます。
ALTER SESSION SET TIME_ZONE = 'America/New_York';
ALTER SESSION SET TIME_ZONE = '-05:00';
上記のどちらかのSQLを実行することによって、セッション中のタイムゾーンが変わっていることを確認できます。
-- タイムゾーンを America/New_York に設定した場合
SQL> ALTER SESSION SET TIME_ZONE = 'America/New_York';
SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
----------------
America/New_York
SQL> SELECT CURRENT_DATE FROM DUAL;
CURRENT_DATE
-------------------
2025-07-19 00:42:59
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
25-07-19 00:43:04.922707 AMERICA/NEW_YORK
-- タイムゾーンを -05:00 に設定した場合
SQL> ALTER SESSION SET TIME_ZONE = '-05:00';
SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
---------------
-05:00
SQL> SELECT CURRENT_DATE FROM DUAL;
CURRENT_DATE
-------------------
2025-07-19 00:42:06
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
-------------------------------
25-07-19 00:42:20.919924 -05:00
同じように、次のようにして任意のタイムゾーンを設定することも出来ます。
-- 世界標準時
ALTER SESSION SET TIME_ZONE = 'UTC';
ALTER SESSION SET TIME_ZONE = 'Etc/GMT';
ALTER SESSION SET TIME_ZONE = 'Europe/London';
ALTER SESSION SET TIME_ZONE = '+00:00';
-- アメリカ・ニューヨーク時間
ALTER SESSION SET TIME_ZONE = 'America/New_York';
ALTER SESSION SET TIME_ZONE = '-05:00';
-- ハワイ・ホノルル時間
ALTER SESSION SET TIME_ZONE = 'Pacific/Honolulu';
ALTER SESSION SET TIME_ZONE = '-10:00';
-- 日本標準時
ALTER SESSION SET TIME_ZONE = 'Asia/Tokyo';
ALTER SESSION SET TIME_ZONE = '+09:00';
また、次のように「LOCAL」というローカル・タイムゾーンを設定することにより、サーバーのOSの時間に設定することも可能です。ここではサーバーは日本時間に設定されていますので、日本時間の日時が取得されています。
SQL> ALTER SESSION SET TIME_ZONE = LOCAL;
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
-------------------------------
25-07-19 14:46:08.914883 +09:00
次のように「DBTIMEZONE」というデータベースのタイムゾーンを設定することによって、データベースに設定されたタイムゾーンの日時を取得することも可能です。ここではデータベースは世界標準時(UTC)に設定していますので、世界標準時の日時が取得されています。
SQL> ALTER SESSION SET TIME_ZONE = DBTIMEZONE;
Session altered.
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
-------------------------------
25-07-19 05:48:57.144373 +00:00
まとめ
ここまで見てきたように、データベースやOSの設定を変更せずに、任意のタイムゾーンの日時を簡単に取得することが出来ます。様々な国や地域向けのアプリケーションを開発したりする場合、様々なタイムゾーンでの日時を表示できるようになりますので非常に便利です。