あなたはデータタイプを誤解しています。あなたが指摘したように、タイムスタンプにはタイムゾーンは保存されませんが、ではなく、では、「ゾーンに接続されたDBに時間を節約できます」ということができます。
あなたは:
insert into toast values (TIMESTAMP '2019-09-23 16:03:11 US/Eastern');
あなたがやっているかのように、プレーンなタイムスタンプにリテラル値の暗黙的な変換を行っている。
insert into toast values (cast (TIMESTAMP '2019-09-23 16:03:11 US/Eastern' as timestamp));
を元ゾーン情報が保持されるかまたは利用できません。元のタイムゾーン情報は破棄されるだけです(UTCなどに変換されることはありません)。
select TIMESTAMP '2019-09-23 16:03:11 US/Eastern',
cast (TIMESTAMP '2019-09-23 16:03:11 US/Eastern' as timestamp)
from dual;
TIMESTAMP'2019-09-2316:03:11US/EASTERN' CAST(TIMESTAMP'2019-09-2316:
--------------------------------------- ----------------------------
23-SEP-19 16.03.11.000000000 US/EASTERN 23-SEP-19 16.03.11.000000000
文字通りあなたのタイムスタンプから元の値は、タイムゾーンを示しています。キャスト値にタイムゾーン情報がありません。
セッションタイムゾーンを変更しても、影響を受けるタイムゾーン情報がないため、表示されているように、平文timestamp
には影響しません。影響を受けるデータタイプはtimestamp with time zone
またはtimestamp with local time zone
にする必要があります。
あなたの場合、最終的に異なるタイムゾーンで2つの値を扱うので、セッションタイムゾーンを使用するだけでは本当に役に立ちません。明示的に指定領域とのいずれか、
create table toast (depart timestamp with time zone,
arrive timestamp with time zone);
insert into toast (depart, arrive)
values (TIMESTAMP '2019-09-23 08:00:00 US/Central',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern');
alter session set time_zone = 'UTC';
Session altered.
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 11:00 US/EASTERN
をして、地元の空港/表示時間帯with datetime expressionsに調整します:あなたは、出発/到着空港のタイムゾーンを意識した時間を格納することができ
select to_char(depart at time zone 'US/Central', 'HH24:MI TZR') as depart,
to_char(arrive at time zone 'US/Central', 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
select to_char(depart at time zone 'US/Eastern', 'HH24:MI TZR') as depart,
to_char(arrive at time zone 'US/Eastern', 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
あなたは確信していた場合やローカル・セッションのタイムゾーンを経由して、それは正しいです:
alter session set time_zone = 'US/Central';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
alter session set time_zone = 'US/Eastern';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
プラーイで行うことができ、しかしUTCとの時間を格納する方が良いかもしれn個のタイムスタンプは、まだあなたが好む場合 - そのすべてが格納されている値は常にUTCであると仮定し - そして、手動またはsys_extract_utc()
で、UTCに元の回を変換:
create table toast (depart timestamp, arrive timestamp);
insert into toast (depart, arrive)
values (sys_extract_utc (TIMESTAMP '2019-09-23 08:00:00 US/Central'),
sys_extract_utc (TIMESTAMP '2019-09-23 11:00:00 US/Eastern'));
...
alter session set time_zone = 'US/Eastern';
select to_char(from_tz(depart, 'UTC') at local, 'HH24:MI TZR') as depart,
to_char(from_tz (arrive, 'UTC') at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
しかし領域を含むかもしれない方が安全です:
create table toast (depart timestamp with time zone,
arrive timestamp with time zone);
insert into toast (depart, arrive)
values (TIMESTAMP '2019-09-23 08:00:00 US/Central' at time zone 'UTC',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern' at time zone 'UTC');
...
alter session set time_zone = 'US/Eastern';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
しかし、あなたはtimestamp with local time zone
を使用する場合は一種の両方の最高の取得、より簡単に、そしてあなたが入力時間を変換する方法のregarless:
create table toast (depart timestamp with local time zone,
arrive timestamp with local time zone);
insert into toast (depart, arrive)
values (TIMESTAMP '2019-09-23 08:00:00 US/Central',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern' at time zone 'UTC');
alter session set time_zone = 'UTC';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
13:00 UTC 15:00 UTC
alter session set time_zone = 'US/Central';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
alter session set time_zone = 'US/Eastern';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
(ALS oデータ型オプションの詳細についてはTony’s Tirade against TIMESTAMP WITH TIME ZONEをお読みください)
優秀な回答 –
@Alex Pooleは詳細な回答にとても感謝しています!私はmsgを次の質問で更新しました。私が前に触れた論文を見ていました。私は他の記事も見ました。基本的には、TIMESTAMPをローカルタイムゾーンで使用するように思われました(?)もしそうなら、TIMESTAMP WITH TIMEZONEはTIMESTAMPとローカルタイムゾーンの代わりになるでしょうか? TIA –
@CaseyHarrils - あなたはTonyの記事の表の下の箇条書きを私とは非常に異なって解釈しているに違いない。 「異なるタイムゾーンを使用してデータをコピーするときは、TIMESTAMPを ローカル時間ゾーンで使用する」と「TIMESTAMPまたはタイムゾーンでタイムゾーンを使用しないでください」を使用してください。これらのすべてに問題はありますが、「現地時間帯のタイムスタンプ」は、あなたがやっていることのために最もシンプルで(トーンの仕事は)上に示したように 'タイムスタンプ 'をつけてすべてをUTCに強制することもできますが、おそらく航空の一般的なアプローチです。 –