/ / SQLクエリで列のタイムゾーンをCETからCSTに変換する方法-SQL、Oracle

どのようにCETからSQLのクエリでCSTに列のタイムゾーンを変換する - SQLは、Oracle

ここで、日付列の値を変換しようとしています CETCST。 使ってみた NEW_TIME(SYSDATE ,"CET","CST") が、「タイムゾーンが不明」というエラーが表示されます。問題は CET オラクルは有効なタイムゾーンとして認識しません。

私は最初に「タイムゾーンで」アプローチを使用しようとしましたが、「タイムゾーン名を列の値に挿入するので、これは望ましくありません」。

回答:

回答№1は0

3文字のタイムゾーンは調整されません夏時間。そのためには、完全に指定されたタイムゾーン名を使用する必要があります。たとえば、カナダには中央標準時間がありますが、サスカチュワン州では夏時間を使用していません。そのため、夏時間を実施している夏の現地時間に今すぐ変換し、正しい完全に指定されたタイムゾーンを知りたい場合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;