首页 > 解决方案 > 将 Oracle 查询迁移到 PostgreSQL

问题描述

你能帮我解决这个问题吗?如何将以下查询转换为 PostgreSQL。

下面的查询在 PostgreSQL 中执行时与在 Oracle 中执行时给出不同的输出。

SELECT 
  to_char(to_date('01011970','ddmmyyyy') + 1/24/60/60 * 4304052,'dd-mon-yyyy hh24:mi:ss') 
from dual;

标签: sqlpostgresql

解决方案


假设您想使用与 Oracle 中相同的表达式来计算结果值。

当您简单地删除它时它不起作用的原因from dual是因为这个表达式被评估0为整数除法将结果截断为 0。

select 1/24/60/60 * 4304052;
 ?column?
----------
        0
(1 row)

如果我将其中一个设为小数,它将为您提供所需的结果

select 1.0/24/60/60 * 4304052;
          ?column?
-----------------------------
 49.815416666666666347848000

现在,在更改此设置后,您的表达式将返回您在 Oracle 中获得的相同结果。

SELECT  to_char( to_date('01011970','ddmmyyyy')
 +  INTERVAL '1 DAY' *  (1.0/24/60/60 * 4304052) ,'dd-mon-yyyy hh24:mi:ss') ;
       to_char
----------------------
 19-feb-1970 19:34:12
(1 row)

请注意,我必须添加一个区间表达式,因为与 Oracle 不同,PostgresDATE不存储时间组件,简单地添加一个数字到日期会导致错误。使用间隔将确保将其评估为时间戳。

knayak=# select pg_typeof( current_date);
 pg_typeof
-----------
 date
(1 row)

knayak=# select pg_typeof( current_date + INTERVAl '1 DAY');
          pg_typeof
-----------------------------
 timestamp without time zone
(1 row)

推荐阅读