您能帮我吗?如何将以下查询转换为PostgreSQL。
以下查询在PostgreSQL中执行时与在Oracle中执行时给出不同的输出。
SELECT
to_char(to_date('01011970','ddmmyyyy') + 1/24/60/60 * 4304052,'dd-mon-yyyy hh24:mi:ss')
from dual;
答案 0 :(得分:1)
假设您要使用与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)
答案 1 :(得分:0)
我想你想要
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');