2013-11-21 6 views
0

У меня есть приложение, использующее Oracle 11g (11.2.0.2.0 64 бит) db.Oracle timestamp, часовой пояс и utc

У меня много записей в таблице Person. Для доступа к данным я использую другое приложение (те же данные). В этом примере я использую поле birth_time моей таблицы персонажей. Некоторые приложения запрашивают данные с birth_time напрямую, некоторые другие с to_char, чтобы переформатировать его, а некоторые другие с функцией UTC.

Проблема заключается в следующем: с теми же данными, с одним и тем же запросом, результат отличается.

В этом скриншоте вы можете увидеть результат с Oracle SQL Developer (3.2.20.09)

Query with Sql developer

Все метки времени вставляются с иссиня метку времени, а на самом деле to_char (..) и результат birth_time - в полночь. Часы UTC возвращаются на один час меньше (Исправлено в соответствии с моим часовым поясом!), Но некоторая запись (здесь одна, например, последняя) - ДВА ЧАСОВ меньше (только немногие на тысячах три)!

Тот же запрос, выполненный с sql * plus, возвращает правильный результат с одним часом разницы для всех записей!

Есть ли у кого-нибудь предложения по решению этой проблемы?

Проблема возникает из-за того, что одно из наших приложений, выполненное с использованием adobe flex, похоже, выполняет запросы с временем UTC, и проблемы возникают, когда вы смотрите на данные с этим компонентом.

пс .: "BIRTH_TIME" является TIMESTAMP (6)

ответ

1

Будет ли это возможно для Вас, чтобы изменить запрос, используемый? Если да, то вы могли бы использовать выражение AT TIME ZONE сказать Oracle, что эта дата в UTC временной зоне:

SELECT SYS_EXTRACT_UTC(CAST(TRUNC(SYSDATE) AS TIMESTAMP)) AS val FROM dual; 

Выход:

VAL       
---------------------------- 
13/11/20 23:00:00,000000000

Теперь, используя AT TIME ZONE 'UTC' получает вас дату нужно:

SELECT SYS_EXTRACT_UTC(
      CAST(
      TRUNC(SYSDATE) AS TIMESTAMP) 
      AT TIME ZONE 'UTC') AS val FROM dual; 

Выход:

VAL       
---------------------------- 
13/11/21 00:00:00,000000000
+0

выберите internal_id, birth_time, SYS_EXTRACT_UTC (CAST (TRUNC (birth_time) AS TIMESTAMP) НА ВРЕМЕННОЙ ЗОНЕ «Европа/Берлин»), to_char (birth_time, 'DD/MM/YYYY HH24: MI') от лица, где name_giv = 'MILENA' и name_fam как 'C%'; верните мне ту же ошибку выше, последняя дата в моем resulset имеет неправильный час. – Francesco

+0

@Francesco Да, потому что вы указали часовой пояс «Европа/Берлин» - см. Мой пример, вы должны использовать часовой пояс «UTC». –

+0

спасибо. Это сработало. Меня смутило значение «в часовом поясе ххх». Мне нужно сделать еще одну работу над моим приложением, но это может сработать. Я все еще удивляюсь, почему тот же запрос дает отличный результат для разработчиков sql * plus и sql: S – Francesco

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