Oracle хранит даты и метки времени в своих собственных внутренних форматах. Вы просто видите, как ваш клиент выбирает их отображение (возможно, с использованием настроек сеанса NLS). Если вы хотите увидеть значение в определенном формате, вам нужно преобразовать его в строку; с CTE для вашего значения образца:
with your_table (zonedDateTime) as (
select to_timestamp_tz('04-JUL-11 03.49.56.235000000 PM ASIA/CALCUTTA', 'DD-MON-RR HH:MI:SS.FF9 AM TZR')
from dual
)
select zonedDateTime as session_format,
to_char(zonedDateTime, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM') as iso_format
from your_table;
SESSION_FORMAT ISO_FORMAT
--------------------------------------------- -----------------------------------
04-JUL-11 03:49:56.235000000 PM ASIA/CALCUTTA 2011-07-04T15:49:56.235+05:30
Похоже, что часовой пояс конвертируется как часть вашего процесса сохранения, возможно, неявно из-за разницы между часовым поясом клиента и сервера при выполнении вставки; но это тот же момент времени.
Вы можете преобразовать обратно в определенное смещение часового пояса как часть этого запроса:
select zonedDateTime as session_format,
to_char(zonedDateTime at time zone '+07:00', 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM') as iso_format
from your_table;
SESSION_FORMAT ISO_FORMAT
--------------------------------------------- -----------------------------------
04-JUL-11 03:49:56.235000000 PM ASIA/CALCUTTA 2011-07-04T17:19:56.235+07:00
... хотя вы, вероятно, хотите использовать имя региона часового пояса, а не фиксированное смещение.
Если вы перетаскиваете данные обратно в любое приложение, которое их заполняет, вы можете также рассмотреть возможность запроса их как исходного типа данных, а не как строки, а затем отформатировать их для display / output / onward-JSON-trip из прикладного уровня.