2013-11-20 3 views
8

У меня есть БД с часовым поясом +04:00 (Europe/Moscow) и нужно преобразовать строку в формате YYYY-MM-DD"T"HH24:MI:SSTZH:TZM в DATE тип данных в Oracle 11g.Oracle Конвертировать TIMESTAMP с часовым поясом в DATE

Другими словами, у меня есть строка 2013-11-08T10:11:31+02:00, и я хочу ее преобразовать в DATE тип данных (в локальной временной шкале DB +04:00 (Europe/Moscow)).

Для строки 2013-11-08T10:11:31+02:00 мои искомое преобразование должно возвращать DATE тип данных с датой 2013-11-08 12:11:31 (т.е. с местной временной зоной трансформацией времени к +04:00 (Europe/Moscow)). Часовой пояс строки может быть другим, а +02:00 в строке выше - пример.

Я попытался сделать это с помощью типа данных TIMESTAMP, но не успел преобразовать часовой пояс.

+0

За исключением ситуаций, для которых требуются «локальные» времена (например, планирование/планирование, особенно для временных зон с летней экономией), обычно лучше хранить абсолютные временные метки, хранящиеся в UTC (и переводить на дисплей/отчет). Для чего используются эти временные метки? –

+0

Я получаю дату в этом формате timestamp из внешней системы и не знаю, почему их использует внешняя система. :( –

+0

Нашел мой ответ .. но в случае, если вы хотите дважды проверить, что timestamp истинна или ложна, я нашел для этого хороший сайт. Http://onlinetimestampconvert.com –

ответ

5
SELECT 
CAST((FROM_TZ(CAST(timezonefield AS TIMESTAMP),'GMT') AT TIME ZONE 'CET') AS DATE) 
FROM table; 

Преобразует метку времени по Гринвичу на сегодняшний день в среднеевропейское время

10

to_timestamp_tz() функция at time zone п может быть использована для преобразования строкового литерала в значение типа timestamp with time zone данных:

SQL> with t1(tm) as(
    2 select '2013-11-08T10:11:31+02:00' from dual 
    3 ) 
    4 select to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
    5   at time zone '+4:00'   as this_way 
    6  , to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
    7   at time zone 'Europe/Moscow' as or_this_way 
    8 from t1 
    9/

Результат:

THIS_WAY       OR_THIS_WAY 
---------------------------------------------------------------------------- 
2013-11-08 12.11.31 PM +04:00  2013-11-08 12.11.31 PM EUROPE/MOSCOW 

И th еп, мы используем cast() функции для получения значения типа date данных:

with t1(tm) as(
    select '2013-11-08T10:11:31+02:00' from dual 
) 
select cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
     at time zone '+4:00' as date) as this_way 
    , cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
     at time zone 'Europe/Moscow' as date) as or_this_way 
    from t1 

This_Way    Or_This_Way 
------------------------------------------ 
2013-11-08 12:11:31 2013-11-08 12:11:31 

Узнайте больше о at time zone пункте и to_timestamp_tz() функции.

+1

Спасибо! 'Select CAST (to_timestamp_tz (' 2013-07-08T10: 11: 31 + 02: 00 ',' yyyy-mm-dd "T" hh24: mi: ss TZH: TZM ') в часовом поясе DBTIMEZONE AS DATE) от двойного 'будет правильным способом для меня –

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