Вот способ использования внутреннего знания Oracle о том, соблюдает ли часовой пояс летнее время или нет, чтобы определить его начало и конец. Помимо сложности и общей странности, требуется, чтобы два часовых пояса имели одинаковое время, когда летнее время не действует, и разное время, когда оно есть. Как таковая, она устойчива к изменениям в конгрессе, когда наступает летнее время (при условии, что ваша база данных обновлена с помощью исправлений), но не устойчива к региональным изменениям, влияющим на часовые пояса, отключенные. С этими предупреждениями вот что у меня есть.
ALTER SESSION SET time_zone='America/Phoenix';
DROP TABLE TimeDifferences;
CREATE TABLE TimeDifferences(LocalTimeZone TIMESTAMP(0) WITH LOCAL TIME ZONE);
INSERT INTO TimeDifferences
(
SELECT to_date('01/01/' || to_char(sysdate-365,'YYYY') || '12:00:00','MM/DD/YYYYHH24:MI:SS')+rownum-1
FROM dual CONNECT BY rownum<=365
);
COMMIT;
ALTER SESSION SET time_zone='America/Edmonton';
SELECT LocalTimeZone-1 DaylightSavingTimeStartAndEnd
FROM
(
SELECT LocalTimeZone,
to_char(LocalTimeZone,'HH24') Hour1,
LEAD(to_char(LocalTimeZone,'HH24')) OVER (ORDER BY LocalTimeZone) Hour2
FROM TimeDifferences
)
WHERE Hour1 <> Hour2;
Я же говорил, это было странно. Код только вычисляет день изменения, но может быть улучшен, чтобы показать час. В настоящее время возвращается 09-Март-08 и 02-Ноябрь-08. Он также чувствителен к времени года, когда он запускается, поэтому мне пришлось сделать -365 ... + 365. В общем, я не рекомендую это решение, но было интересно исследовать. Может быть, у кого-то есть что-то лучше.