sql - 将 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;
解决方案
假设您想使用与 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)
推荐阅读
- javascript - 关联属性不适用于 node.js
- powershell - 如何替换字符串中的 $(data)?
- java - 如何让 ImageIcon 在所有平台上工作
- mysql - XAMPP 无法开始运行 MySQL
- c - Volatile int vs int 变量效应
- http - 我想在 Elm 中初始化函数
- flutter - 什么主题元素控制 TextField 小部件的焦点颜色
- angular - Angular 8 - 如何拦截来自(rxjs)的http错误?
- ios - 如何从 AppDelegate 显示 iOS 13 SwiftUI 视图?
- laravel - Laravel:如何检查数组是否为空?