PostgreSQL时间计算函数NUMTODSINTERVAL(兼容oracle)

oracle中的时间计算函数NUMTODSINTERVAL和NUMTOYMINTERVAL经常会被使用,可以让我们将数字转换成时间间隔类型的数据。
例如我们在oracle中创建interval分区表时会经常使用到:

SQL> CREATE TABLE interval_day_tbl1
  2  (
  3    employee_id         NUMBER,
  employee_name       VARCHAR2(20),
  4    5    birthday            DATE    
  6  )
PARTITION BY RANGE(birthday)
  7    8  INTERVAL (NUMTODSINTERVAL(1,'day')) 
  9  (
 10    PARTITION partition20140101 VALUES LESS THAN(to_date('2020-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss'))
 11  );

Table created.

在PostgreSQL中,我们想要将数字转换成时间间隔类型并不需要进行使用函数转换,在pg中自带了interval类型的数据,我们可以直接拿来使用。

例如:

bill=# select interval '1 days';  
 interval 
----------
 1 day
(1 row)

bill=# select interval '1 hours';      
 interval 
----------
 01:00:00
(1 row)

pg中interval类型用法为:

[@] quantity unit [quantity unit...] [direction]

其中quantity是一个数字(很可能是有符号的); unit是毫秒、 millisecond、second、 minute、hour、day、 week、month、year、 decade、century、millennium 或者缩写或者这些单位的复数; direction可以是ago或者为空。

但是我们如果从oracle迁移到PostgreSQL时有很多使用NUMTODSINTERVAL函数的地方,那么修改的工作量则会很大,我们可以使用pg自定义函数的方法来进行兼容。

兼容方法:
自定义函数:

bill=# create or replace function NUMTODSINTERVAL(float8, text) returns interval as $$  
bill$#   select ($1||' '||$2)::interval;  
bill$# $$ language sql strict immutable;  
CREATE FUNCTION

使用:

bill=# select NUMTODSINTERVAL(1.1, 'second');  
 numtodsinterval 
-----------------
 00:00:01.1
(1 row)

bill=# select NUMTODSINTERVAL(1, 'HOUR');      
 numtodsinterval 
-----------------
 01:00:00
(1 row)

参考链接:
https://www.postgresql.org/docs/12/datatype-datetime.html#DATATYPE-INTERVAL-INPUT

你可能感兴趣的:(PostgreSQL,数据库,sql,postgresql)