迁移 Oracle 到 PostgreSQL: 时间类型相减的结果类型

五月 18, 2023

Oracle 时间相减,得到的是一个浮点值N,代表N天。

PostgreSQL 时间相减,得到的是一个时间间隔类型,但是可以转换为一个浮点值。

Oracle 示例

SQL> select sysdate - to_date('2017-01-01','yyyy-mm-dd') from dual;
SYSDATE-TO_DATE('2017-01-01','YYYY-MM-DD')
------------------------------------------
                                501.794444

PostgreSQL 示例

1、原生时间相减返回的是 interval

postgres=# select now() - to_timestamp('2017-01-01','yyyy-mm-dd');
         ?column?
--------------------------
 501 days 19:01:15.950408
(1 row)

2、采用 extract 可以将 interval 转换为秒

postgres=# select extract(epoch from now()-to_timestamp('2017-01-01','yyyy-mm-dd'));
   date_part
----------------
 43354846.07834
(1 row)

3、除以 86400 就得到天

postgres=# select 43354846/86400;
       ?column?
----------------------
 501.7921990740740741
(1 row)

为了方便使用,可以定义个函数

 create or replace function ts_ts(timestamp, timestamp) returns float8 as $$
   select extract(epoch from $1-$2)/86400;
 $$ language sql strict immutable;

使用函数相减即可得到天为单位的的浮点数

postgres=# select ts_ts(now(),to_timestamp('2017-01-01','yyyy-mm-hh'));
      ts_ts
------------------
 501.755990025012
(1 row)