2015-07-27 3 views
0

все даты, которые мы храним в oracle, находятся в EDT (лето) и EST (зима). Мне нужен способ конвертировать эту дату в UTC/GMT.Oracle EDT/EST время до GMT конверсия

Преобразование должно основываться на дате db, а не на локальных серверах TZ. Другими словами, если дата в результирующем между:

"11/02/2014 02:00:00" ---> "03/08/2015 01:59:59": TZ offset = "-0500" 
"03/08/2015 02:00:00" ---> "11/01/2015 01:59:59": TZ offset = "-0400". 

И так же за предыдущие годы. Есть ли решение для этого?

+0

Вы, возможно, ищете: 'some_date_column в часовом поясе 'GMT''? –

+0

Что такое SOME_DATE_COLUMN? – user3092750

+0

Я попытался выбрать ** AT TIME ZONE dbtimezone **, но я всегда получаю -05: 00. Думаю, я запустил его в декабре, он вернется -04: 00. Есть ли способ вернуть правильное смещение, связанное с датой в наборе результатов? – user3092750

ответ

0

Предполагая some_date_column фактически столбец даты, то вы можете превратить его в метку времени с часовым поясом, используя приведение (от даты до метки времени) и the from_tz function с областью, которая имеет изменение EST/EDT определено:

with t (some_date_column) as (
    select to_date('11/02/2014 02:00:00', 'MM/DD/YYYY HH24:MI:SS') from dual 
    union all 
    select to_date('03/08/2014 01:59:59', 'MM/DD/YYYY HH24:MI:SS') from dual 
    union all 
    select to_date('03/08/2015 03:00:00', 'MM/DD/YYYY HH24:MI:SS') from dual 
    union all 
    select to_date('11/01/2015 00:59:59', 'MM/DD/YYYY HH24:MI:SS') from dual 
    union all 
    select to_date('11/01/2015 01:59:59', 'MM/DD/YYYY HH24:MI:SS') from dual 
    union all 
    select to_date('11/02/2015 02:00:00', 'MM/DD/YYYY HH24:MI:SS') from dual 
) 
select t.some_date_column, 
    cast(t.some_date_column as timestamp) as some_timestamp, 
    from_tz(cast(t.some_date_column as timestamp), 'America/New_York') 
    as some_timestamp_tz 
from t; 

SOME_DATE_COLUMN SOME_TIMESTAMP  SOME_TIMESTAMP_TZ   
------------------- ------------------- --------------------------- 
11/02/2014 02:00:00 11/02/2014 02:00:00 11/02/2014 02:00:00 -05:00 
03/08/2014 01:59:59 03/08/2014 01:59:59 03/08/2014 01:59:59 -05:00 
03/08/2015 03:00:00 03/08/2015 03:00:00 03/08/2015 03:00:00 -04:00 
11/01/2015 00:59:59 11/01/2015 00:59:59 11/01/2015 00:59:59 -04:00 
11/01/2015 01:59:59 11/01/2015 01:59:59 11/01/2015 01:59:59 -05:00 
11/02/2015 02:00:00 11/02/2015 02:00:00 11/02/2015 02:00:00 -05:00 

Это не совсем соответствует диапазонам в вашем вопросе. Нет 02:00, когда вы переходите с EST на EDT, поэтому я использовал 03:00 в демо-версии CTE; и поскольку период между 01:00 и 02:00 (повторяющийся) повторяется, когда вы идете в другую сторону с EDT на EST, смещение за обычное время в этот час неоднозначно, и Oracle предпочитает рассматривать его как -05 : 00, а не -04: 00.

Если вы хотите, чтобы UTC эквивалент времени EST/EDT, то вы можете использовать at time zone, и, возможно, отбрасывать назад к дате:

... 
select t.some_date_column, 
    from_tz(cast(t.some_date_column as timestamp), 'America/New_York') 
    at time zone 'UTC' as utc_timestamp_tz, 
    cast(from_tz(cast(t.some_date_column as timestamp), 'America/New_York') 
    at time zone 'UTC' as date) as utc_date 
from t; 

SOME_DATE_COLUMN UTC_TIMESTAMP_TZ   UTC_DATE   
------------------- --------------------------- ------------------- 
11/02/2014 02:00:00 11/02/2014 07:00:00 +00:00 11/02/2014 07:00:00 
03/08/2014 01:59:59 03/08/2014 06:59:59 +00:00 03/08/2014 06:59:59 
03/08/2015 03:00:00 03/08/2015 07:00:00 +00:00 03/08/2015 07:00:00 
11/01/2015 00:59:59 11/01/2015 04:59:59 +00:00 11/01/2015 04:59:59 
11/01/2015 01:59:59 11/01/2015 06:59:59 +00:00 11/01/2015 06:59:59 
11/02/2015 02:00:00 11/02/2015 07:00:00 +00:00 11/02/2015 07:00:00 

Если исходный столбец временной метки (без часового пояса информация), а не дату, тогда вы можете пропустить первый бросок с даты на отметку времени, но по-прежнему используйте , чтобы указать его исходный регион.

Смежные вопросы