oracle和postgres之间的时间戳变化

时间:2017-01-22 16:08:14

标签: oracle postgresql timezone timestamp

目前,我正在努力将Oracle数据库架构迁移到Postgres。作为其中的一部分,我必须在Oracle中转换自定义实用程序函数,该函数根据时区生成时间戳。但从Oracle和Postgres获得的值似乎变化了一个小时。

甲骨文:

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

我猜这种差异的原因是因为夏令时但我不确定。任何人都可以帮我解决这个问题。 我正在使用Postgres v9.6和Oracle 12c。

1 个答案:

答案 0 :(得分:0)

好吧,我发现了我正在做的错误。 Postgres似乎以不同方式处理缩写的时区名称和完整时区名称。如果您想要合并与日光相关的更改,则必须使用完整的时区名称。在我的案例中使用' Europe / Amsterdam'而不是CET'产生了与Oracle相同的结果。 要查找Postgres支持的完整时区名称的完整列表,我使用了查询:

select * from pg_timezone_names where abbrev='CET';