Предполагая 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
Если исходный столбец временной метки (без часового пояса информация), а не дату, тогда вы можете пропустить первый бросок с даты на отметку времени, но по-прежнему используйте , чтобы указать его исходный регион.
Вы, возможно, ищете: 'some_date_column в часовом поясе 'GMT''? –
Что такое SOME_DATE_COLUMN? – user3092750
Я попытался выбрать ** AT TIME ZONE dbtimezone **, но я всегда получаю -05: 00. Думаю, я запустил его в декабре, он вернется -04: 00. Есть ли способ вернуть правильное смещение, связанное с датой в наборе результатов? – user3092750