ローカルタイムゾーンのタイムスタンプ
このように機能します。アプリケーションでタイムゾーンを操作する必要がある場合、一般的なアプローチは
それがまさにTIMESTAMPWITH LOCAL TIME ZONE
動作します-唯一の違いは
そのため、 DBTIMEZONE
を変更することはできません。 ( ALTER DATABASE SET TIME_ZONE ='...';
を使用 )データベースに TIMESTAMP WITH LOCAL TIME ZONE
のテーブルが含まれている場合は、データベース上で 列と列にはデータが含まれています。
SYSTIMESTAMP
データベースサーバーのオペレーティングシステムのタイムゾーンで返されます。 DBTIMEZONE
ない SYSTIMESTAMP
のタイムゾーン またはSYSDATE
。
DBTIMEZONE
TIMESTAMP WITH LOCAL TIME ZONE
の内部ストレージ形式を定義します データ型の列。これを忘れてください。あなたがそれを必要とするようなユースケースを想像することはできません。
実際、テーブルはこの選択と同等です:
select
CAST(systimestamp AS timestamp(0) with local time zone) as SYSTIMESTAMP_COL,
CAST(sysdate AS timestamp(0) with local time zone) as SYSDATE_COL,
CAST(current_timestamp AS timestamp(0) with local time zone) as CURRENT_TIMESTAMP_COL,
CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) as DATE_COL
from dual;
CAST({タイムゾーンのない時間}とローカルタイムゾーン)
を作成する場合 次に、タイムゾーン情報のない日付/時刻値をタイムゾーンのある日付/時刻値に変換しようとします。 Oracleにはタイムゾーン情報がないため、原則としてこれは不可能です。そのため、Oracleはタイムゾーンを想定しています。このようなキャストを行う場合、Oracleは常に{code> SESSIONTIMEZONEで指定されている{タイムゾーンのない時間}を考慮します。 (変換の瞬間)
したがって、 CAST(sysdate AS timestamp(0)with local time zone)
CAST(FROM_TZ(TO_TIMESTAMP(SYSDATE), SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)`
それぞれ CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0)with local time zone)
は
CAST(FROM_TZ(TIMESTAMP '2017-03-15 19:02:00', SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)
SYSDATE
の場合 SYSDATE
であるため、これは実際には間違っています。 SESSIONTIMEZONEではなく、データベースサーバーのオペレーティングシステムのタイムゾーンで指定されます。 2つ目は、結果が正しいかどうかは意図によって異なります。
SYSTIMESTAMP
戻り値TIMESTAMPWITH TIME ZONE
、現在の SESSIONTIMEZONE
から常に独立しています 。ただし、 TIMESTAMP WITH LOCAL TIME ZONE
に変換する場合 もちろん、現在のローカルタイムゾーンに変換されます。 CURRENT_TIMESTAMP
を使用することもできます またはSYSTIMESTAMPAT LOCAL
これは多かれ少なかれ同じことをします。
このコード
間違っているようです。結果は次のようになります
-- SYSTIMESTAMP_COL 15/03/2017 16:01:14
-- SYSDATE_COL 15/03/2017 19:01:14
-- CURRENT_TIMESTAMP_COL 15/03/2017 16:01:14
-- DATE_COL 15/03/2017 19:02:00
違いはあるべき姿に見えますが、絶対値は「偽造」されているようです(またはデータベースに実際の問題があります)。