目前,我正在努力将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。
答案 0 :(得分:0)
好吧,我发现了我正在做的错误。 Postgres似乎以不同方式处理缩写的时区名称和完整时区名称。如果您想要合并与日光相关的更改,则必须使用完整的时区名称。在我的案例中使用' Europe / Amsterdam'而不是CET'产生了与Oracle相同的结果。 要查找Postgres支持的完整时区名称的完整列表,我使用了查询:
select * from pg_timezone_names where abbrev='CET';