2017-01-22 5 views
0

В настоящее время я работаю над переносом схемы базы данных Oracle в Postgres. В рамках этого я должен преобразовать пользовательскую функцию утилиты в Oracle, которая генерирует временные метки, основанные на часовом поясе. Но значения, полученные от Oracle и Postgres, по-видимому, меняются на один час.Временная разница между оракулом и postgres

Oracle:

SELECT (to_timestamp_tz('20300714 235959 CET','YYYYMMDD HH24MISS TZR') - to_timestamp_tz('19700101 000000 GMT','YYYYMMDD HH24MISS TZR')) 
    as foo FROM dual; 

дает +22109 21: 59: 59,000000

Postgres:

select ('20300714 235959'::timestamp AT TIME ZONE 'CET') - ('19700101 000000'::timestamp AT TIME ZONE 'GMT') as foo; 

урожаи 22109 дней 22:59:59

I g Причина этой разницы связана с летним временем, но я не уверен. Может ли кто-нибудь помочь мне решить эту проблему. Я использую Postgres v9.6 и Oracle 12c.

ответ

0

Ну, я нашел ошибку, которую я делал. Кажется, что Postgres обрабатывает сокращенное имя часового пояса и полное имя часового пояса по-разному. Если вы хотите включить изменения, связанные с дневным светом, вам нужно будет использовать полное имя часового пояса. В моем случае использование «Европа/Амстердам» вместо «CET» дало тот же результат, что и Oracle. Чтобы найти полный список полных имен часовых поясов, поддерживаемых Postgres, я использовал запрос:

select * from pg_timezone_names where abbrev='CET';