Различные результаты для TO TIMESTAMP TZ и CAST AS TIMESTAMP WITH LOCAL TIME ZONE в Oracle DB
У меня есть база данных Oracle 11g, и я пытаюсь поэкспериментировать с тем, как DST обрабатывается с типами данных временных меток (особенно теми, которые создаются из входящих данных, в которых нет часового пояса). Я вижу разницу в поведении при использовании TO_TIMESTAMP_TZ () против CAST (DATE as TIMESTAMP WITH LOCAL TIME ZONE), которую я не могу объяснить. Я ожидал бы, что результирующий тип данных является зональной меткой времени независимо от того, как он создается, и любая операция над ним будет идентична, но она не появляется что это так и есть.
Есть идеи, почему при использовании опции CAST "лишний" час, созданный изменением осеннего 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
1 ответ:
Похоже, что это сводится к тому, что TO_TIMESTAMP_TZ пытается вывести элемент TZD метки времени из даты, в то время как приведение в качестве метки времени с локальным часовым поясом будет принимать текущий TZD базы данных независимо от того, когда дата. Или у них просто есть разные стандартные модели поведения для выбора, какое из 1AM раз (до или после изменения времени) выбрать. Это различие в поведении приводит к тому, что результирующий час будет отличаться на единицу.
Спасибо руудван!
Запрос:
select to_char(to_timestamp_tz('11/1/2015 1:00 AM US/Pacific', 'MM/DD/YYYY HH:mi AM TZR'), 'TZD') as TZD_TO_TS_TZ_1, to_char(cast(to_date('11/1/2015 1:00 AM', 'MM/DD/YYYY HH:mi AM') as timestamp with local time zone), 'TZD') as TZD_CAST_1, to_char(to_timestamp_tz('11/1/2015 12:00 AM US/Pacific', 'MM/DD/YYYY HH:mi AM TZR'), 'TZD') as TZD_TO_TS_TZ_12, to_char(cast(to_date('11/1/2015 12:00 AM', 'MM/DD/YYYY HH:mi AM') as timestamp with local time zone), 'TZD') as TZD_CAST_12 from dual;Результаты:
TZD_TO_TS_TZ_1 TZD_CAST_1 TZD_TO_TS_TZ_12 TZD_CAST_12 PST PDT PDT PDT
Comments