Преобразование часовых поясов Oracle (с использованием from_tz) - PullRequest
6 голосов
/ 13 февраля 2012

Я пытаюсь преобразовать время (дата + время) из одного часового пояса в другой. В приведенном ниже запросе я пытаюсь преобразовать время из EST («Америка / Нью-Йорк») в PST («Америка / Лос-Анджелес»). Запрос частично работает; результаты:

DATABASE_DATE = 2012-02-13 1:00:00 PM  
LOCALTIME (what I get): 2012-02-12 10:00:00 AM.

Так что время хорошее, а дата неправильная. Это должно быть 2012-02-13 вместо 2012-02-12.

Я что-то не так делаю? Вот мой запрос:

select to_date( to_char( ( from_tz( to_timestamp( DATABASE_DATE
                                                 , 'YYYY-MM-DD HH:MI:SS')
                                   ,'America/New_York')
                          at time zone 'America/Los_Angeles')
                       ,'YYYY-MM-DD HH:MI:SS')
               ,'YYYY-MM-DD HH:MI:SS') as localtime
 from table

Спасибо

Ответы [ 3 ]

6 голосов
/ 13 февраля 2012

to_timestamp () получает строку (VARCHAR2, CHAR ...), если вы пытаетесь присвоить ей дату, тогда oracle преобразует ее в строку в соответствии с NLS_DATE_FORMAT, которая может отличаться в разных средах, и возвращает неожиданные результаты (как в это дело).
Сначала вы должны использовать to_char, чтобы ваш запрос мог выглядеть так:

select to_date(to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York')
at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM'),'YYYY-MM-DD HH:MI:SS PM') as localtime
from table

ОБНОВЛЕНИЕ: если я вас правильно понимаю, то вы хотите что-то вроде этого:

select to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York')
    at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM TZD') as localtime
    from table
2 голосов
/ 28 мая 2013
SELECT TO_CHAR(NEW_TIME(systimestamp,'EST','PST'), 'DD-MON-YY HH24:MI:SS') AS converted_timestamp_column FROM DUAL;
1 голос
/ 19 мая 2016

Пожалуйста, попробуйте это тоже. Для этого есть функция в Oracle

https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_2036.htm

select NEW_TIME (TO_DATE ('2011/11/11 01:45', 'yyyy/mm/dd HH24:MI'), 'AST', 'MST') from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...