Oracle 11g データベースがあり、DST が TIMESTAMP データ型 (特に、タイム ゾーンが含まれていない受信データから作成されたもの) でどのように処理されるかを実験しようとしています。TO_TIMESTAMP_TZ() と CAST(DATE as TIMESTAMP WITH LOCAL TIME ZONE) を使用すると、説明できない動作の違いが見られます。結果のデータ型は、作成方法に関係なくゾーン化されたタイムスタンプであり、それに対する操作は同じであると予想されますが、そうではないようです。
CAST オプションを使用しているときに、秋の DST 変更によって作成された「余分な」時間が INTERVAL 計算で考慮されない理由は何ですか? 以下のクエリの両方の行が同一であると予想されます。
クエリ:
select to_timestamp_tz('11/1/2015 1:00 AM US/Pacific', 'MM/DD/YYYY HH:mi AM TZR') + interval '2' hour as DST_PLUS_2, -- this is a post DST jump time
to_timestamp_tz('11/1/2015 12:59 AM US/Pacific', 'MM/DD/YYYY HH:mi AM TZR') + interval '2' hour as PRE_DST_PLUS_2, -- this is a pre DST jump time
to_char(to_timestamp_tz('11/1/2015 1:00 AM US/Pacific', 'MM/DD/YYYY HH:mi AM TZR'), 'TZR') as TZR
from dual
union all
select cast(to_date('11/1/2015 1:00 AM', 'MM/DD/YYYY HH:mi AM') as timestamp with local time zone) + interval '2' hour as DST_PLUS_2,
cast(to_date('11/1/2015 12:59 AM', 'MM/DD/YYYY HH:mi AM') as timestamp with local time zone) + interval '2' hour as PRE_DST_PLUS_2,
to_char(cast(to_date('11/1/2015 1:00 AM', 'MM/DD/YYYY HH:mi AM') as timestamp with local time zone), 'TZR') as TZR
from dual;
結果:
DST_PLUS_2 PRE_DST_PLUS_2 TZR
01-NOV-15 03.00.00.000000000 AM US/PACIFIC 01-NOV-15 01.59.00.000000000 AM US/PACIFIC US/PACIFIC
01-NOV-15 03.00.00.000000000 AM US/PACIFIC 01-NOV-15 02.59.00.000000000 AM US/PACIFIC US/PACIFIC