Кузница ИванКо

30 07 2006

Oracle DST moment

Опубликовано в: sql, work, oracle, Без рубрики — kig @ 09:02

В один момент понадобилось получать таблицу из часов для передачи во вложенные вызовы. Понятно, что select ‘0′ from dual union all … select 23 from dual - не годился. У нас есть переходы на летнее время и хотелось бы их учитывать. ФОРС по моему вопросу признался что это не легко и они написали процедуру специально для такого случая.
А вот как это можно делать селектом. (дата которая подставляется снаружи - через bindParameter в jdbc

SELECT '0' as hour from dual union all
SELECT '1' as hour from dual union all
SELECT '2' as hour from dual union all
SELECT '3' as hour from dual union all
SELECT '4' as hour from dual union all
SELECT '5' as hour from dual union all
SELECT '6' as hour from dual union all
SELECT '7' as hour from dual union all
SELECT '8' as hour from dual union all
SELECT '9' as hour from dual union all
SELECT '10' as hour from dual union all
SELECT '11' as hour from dual union all
SELECT '12' as hour from dual union all
SELECT '13' as hour from dual union all
SELECT '14' as hour from dual union all
SELECT '15' as hour from dual union all
SELECT '16' as hour from dual union all
SELECT '17' as hour from dual union all
SELECT '18' as hour from dual union all
SELECT '19' as hour from dual union all
SELECT '20' as hour from dual union all
SELECT '21' as hour from dual union all
SELECT '22' as hour from dual union all
SELECT '23' as hour from dual union all
SELECT '24' as hour from dual
where rownum < (SELECT DECODE(was || will, '0203', 23, '0302', 25, 24)
FROM (SELECT TO_CHAR(testdate + INTERVAL '1' DAY, 'hh24') was,
TO_CHAR(testdate + INTERVAL '2' DAY, 'hh24') will
FROM (SELECT CAST(TRUNC(TO_DATE('2006.03.26', 'yyyy-mm-dd')) -
INTERVAL '2' DAY + INTERVAL '3' HOUR AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'Europe/Moscow' testdate
FROM DUAL)))

Проверял работу, используя данные о переходах на летнее/зимнее время и между ними.

Работает на WordPress