Как определить, находится ли определенный TIMESTAMP с зоной времени в пределах летнего времени или нет - PullRequest
3 голосов
/ 02 ноября 2010

У меня есть приложение, которое хранит время по Гринвичу, но связано с аэропортами, которые имеют названия Olsen tz, такие как «Америка / Нью-Йорк».

Мне нужно определить, относится ли данная дата к местному периоду перехода на летнее время.

Самое близкое, что я мог найти, это TZ_OFFSET ('Tzname'), но нет простого способа получить время начала / окончания следующего летнего времени относительно некоторой даты.

Это похоже на шаг в правильном направлении ...

выберите приведение (mydate в качестве временной метки) в часовом поясе «GMT» в качестве mydateZ, from_tz (приведение (mydate как метка времени), «GMT») в часовом поясе myzoneName как mydateLocal

1 Ответ

0 голосов
/ 08 ноября 2010

Размышляя о подобной проблеме, я написал следующий запрос к вашему вопросу:

select decode(to_char(from_tz(cast (sysdate as timestamp),'CET'),'TZR'),
to_char(from_tz(cast (sysdate as timestamp),'CET'),'TZD'),'N','Y') is_daylight 
from dual

Краткое объяснение: Я конвертирую текущую дату (sysdate) в моем часовом поясе ('CET') в метку времени и сравниваю обычное имя ('TZR') и ​​название летнего времени ('TZD') часового пояса. Если они совпадают, то sysdate находится не в пределах летнего времени, а если они не совпадают (например, sysdate-100 - это «CEST» для часового пояса «CET»), тогда дата находится в пределах летнего времени. Дата и часовой пояс могут быть параметром запроса.

...