五月 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)