我有一个 Oracle 11g 数据库,我正在尝试使用 TIMESTAMP 数据类型(尤其是从不包含时区的传入数据创建的数据类型)来试验如何处理 DST。在使用 TO_TIMESTAMP_TZ() 与 CAST(DATE as TIMESTAMP WITH LOCAL TIME ZONE) 时,我看到了我无法解释的行为差异。我希望生成的数据类型是分区时间戳,无论它是如何创建的,并且对它的任何操作都是相同的,但情况似乎并非如此。
知道为什么在使用 CAST 选项时,在 INTERVAL 数学中没有考虑到由秋季 DST 更改创建的“额外”小时?我希望下面查询的两行是相同的。
询问:
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