ここで、日付列の値を変換しようとしています CET
に CST
。 使ってみた NEW_TIME(SYSDATE ,"CET","CST")
が、「タイムゾーンが不明」というエラーが表示されます。問題は CET
オラクルは有効なタイムゾーンとして認識しません。
私は最初に「タイムゾーンで」アプローチを使用しようとしましたが、「タイムゾーン名を列の値に挿入するので、これは望ましくありません」。
回答:
回答№1は03文字のタイムゾーンは調整されません夏時間。そのためには、完全に指定されたタイムゾーン名を使用する必要があります。たとえば、カナダには中央標準時間がありますが、サスカチュワン州では夏時間を使用していません。そのため、夏時間を実施している夏の現地時間に今すぐ変換し、正しい完全に指定されたタイムゾーンを知りたい場合DBタイムゾーンファイルの名前(V $ TIMEZONE_NAMESから*を選択すると、DBにインストールされているリストを確認できます。):
SELECT "Central" locale
, extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Central") tz_abbrv
, CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Central" as timestamp) local_time from dual
union all
SELECT "Saskatchewan" locale
, extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Saskatchewan") tz_abbrv
, CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Saskatchewan" as timestamp) local_time from dual;
LOCALE TZ_ABBRV LOCAL_TIME
Central CDT 03/08/2016 9:57:24.000000 AM
Saskatchewan CST 03/08/2016 8:57:24.000000 AM
そうでなければ、いつ切り替えるかをコーディングする必要があります計算におけるCSTとDSTの間-夏時間の開始と終了のルールは時間とともに変更され、将来再び変更される可能性があることに注意してください。
挿入に関するコメントに返信してください最初に列がタイムゾーンを含むように定義されていることを確認し(データ型 "timestamp with timezone")、CASTを "timestamp"から "timestamp with time zone"に変更して、ゾーン情報が保存されるようにします。
例えば。)
create table mbt (stz timestamp with time zone)
insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Indian/Maldives" as timestamp with time zone) )
insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Eastern" as timestamp with time zone) )
commit;
select * from mbt;
STZ
05/08/2016 8:06:49.000000 PM +05:00
05/08/2016 11:06:50.000000 AM -04:00
WITH TIME ZONEを含めない場合は、変更された値を取得する必要がありますが、値はサーバーのタイムゾーンにあると想定されるため、ローカル時間から別のタイムゾーンに簡単に変換することはできません。
drop table mbt;
create table mbt (stz timestamp);
insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Indian/Maldives" as timestamp) );
insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Eastern" as timestamp ) );
commit;
select * from mbt;
STZ
-------------------------------
05-AUG-16 08.13.16.000000 PM
05-AUG-16 11.13.16.000000 AM
回答№2の場合は0
タイムゾーンを削除するには、使用できます cast(.... as Timesamp)
。 私の例をチェックしてください。
select cast( current_timestamp at time zone "CST" as timestamp), cast( current_timestamp at time zone "CST" as timestamp with time zone) from dual;