У дат Oracle нет информации о часовом поясе.Вместо этого вам нужно будет использовать тип данных TIMESTAMP.
Это работает примерно так:
SQL> desc tz
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
TS TIMESTAMP(6) WITH TIME ZONE
TNOW TIMESTAMP(6) WITH TIME ZONE
SQL> insert into tz
2 values (1
3 , to_timestamp_tz('2002-10-10 12:00:00-05:00'
4 , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
5 , systimestamp)
6 /
1 row created.
SQL> select * from tz
2 /
ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00
SQL>
Обратите внимание, что в нотации XSD есть хитрая проблема T .Это вызывает исключение ORA-01858
, потому что это неправильный формат в Oracle.Я уверен, что есть обходной путь, но в настоящее время он ускользает от меня.
Что ж, одним из обходных путей является применение функции SUBSTR () для разделения двух частей временной метки, как показывает Боб.Но должен быть более элегантный способ.
Возможно, это не квалифицируется как "элегантный", но поскольку это строка, мы можем использовать функцию подстановки, чтобы избавиться от надоедливого T:
SQL> insert into tz
2 values (2
3 , to_timestamp_tz(translate('2003-10-10T12:00:00-05:00', 'T', ' ')
4 , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
5 , systimestamp)
6 /
1 row created.
SQL> select * from tz
2 /
ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00
2
10-OCT-03 12.00.00.000000 -05:00
23-AUG-10 17.53.37.113000 +01:00
SQL>
Но, учитывая всеусилия Oracle, вложенные в XMLDB, довольно неприятно, что нет более аккуратного решения.
«Я не понимаю, как вы получаете -05: 00.»
В моем исходном примере я использую маску формата 'YYYY-MM-DD HH24:MI:SS-TZH:TZM'
.Это интерпретирует -
в часовом поясе как разделитель , а не знак минус.Следовательно, он вернул +05: 00.С тех пор я исправил мой пример кода, чтобы удалить этот последний штрих.Теперь часовой пояс правильно отображается как -05: 00.Извините за путаницу.