持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第36天
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)