データがすでにOracleSQLテーブルにあり、タイムゾーン付きのタイムスタンプに変換する必要がある場合(たとえば、同じテーブルに作成した新しい列)、OSに明示的に移動する必要はありません。 Oracleデータベース自体以外のJavaまたはその他のものを使用します。
「日付」がサーバーのタイムゾーン(通常はサーバーを意味する「データベース」と言います)またはクライアントのタイムゾーン(「セッション」と言う)にあると想定する必要があるかどうかは、質問からは明らかではありません。クライアント)。どちらの方法でも:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
またはsessiontimezone
を使用します 2番目の引数として、それが必要な場合。
これは、データベース(および/またはセッション)のタイムゾーンが、クライアントのデータベースでそれぞれ適切に設定されていることを前提としています。そうでない場合/そうでない場合は、最初に修正する必要があります。そもそもパラメータが正しく設定されていれば、Oracleは日中の節約時間を完全に処理できます。 (そうでない場合は、データベースが最初にサポートするよりも操作を「より正確」にしようとする理由が明確ではありません。)
例:以下のWITH句で、列dt
を持つテーブルをシミュレートします。 データ型date
。次に、それをtimestamp with time zone
に変換します 、私のセッションの(クライアント)タイムゾーンで。
with
my_table ( dt ) as (
select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual
)
select dt,
from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from my_table
;
DT TS_WITH_TZ
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES