首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Oracle查询迁移到PostgreSQL

将Oracle查询迁移到PostgreSQL
EN

Stack Overflow用户
提问于 2019-05-30 23:42:05
回答 2查看 58关注 0票数 0

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

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

代码语言:javascript
复制
SELECT 
  to_char(to_date('01011970','ddmmyyyy') + 1/24/60/60 * 4304052,'dd-mon-yyyy hh24:mi:ss') 
from dual;
EN

回答 2

Stack Overflow用户

发布于 2019-05-31 00:26:42

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

当您简单地删除from dual时,它不起作用的原因是,当整数除法将结果截断为0时,此表达式的计算结果为0

代码语言:javascript
复制
select 1/24/60/60 * 4304052;
 ?column?
----------
        0
(1 row)

如果我把它们中的一个设为小数,就会得到所需的结果

代码语言:javascript
复制
select 1.0/24/60/60 * 4304052;
          ?column?
-----------------------------
 49.815416666666666347848000

现在,在对此进行更改后,表达式将返回与在Oracle中相同的结果。

代码语言:javascript
复制
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不存储时间部分,简单地向日期添加一个数字将导致错误。使用时间间隔将确保它将被计算为时间戳。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2019-05-31 00:37:11

我认为你想要:

代码语言:javascript
复制
select '1970-01-01'::date + 4304052 * interval '1 second';

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

代码语言:javascript
复制
select to_char('1970-01-01'::date + 4304052 * interval '1 second', 'YYYY-MM-SS HH24:MI:SS');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56381428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档