繁体   English   中英

将Oracle查询迁移到PostgreSQL

[英]Migrating Oracle query to PostgreSQL

你能帮我吗? 如何将以下查询转换为PostgreSQL。

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

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

假设您要使用与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不同,Postgres DATE不存储时间分量,而仅添加一个数字会导致错误。 使用间隔将确保将其评估为时间戳。

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)

我想你要:

select '1970-01-01'::date + 4304052 * interval '1 second';

如果确实需要,可以使用to_char()将其转换回字符串:

select to_char('1970-01-01'::date + 4304052 * interval '1 second', 'YYYY-MM-SS HH24:MI:SS');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM