背景
LightDB致力于兼容 oracle语法,目标是 oracle 用户不用修改 sql 代码无缝切换到LightDB数据库。oracle中的ceil函数支持对两个日期之差做向上取整,例如如下sql:
SQL> select ceil(date'2023-11-30' - date'2023-10-31') from dual;
CEIL(DATE'2023-11-30'-DATE'2023-10-31')
---------------------------------------
30
而原生pg并不能支持,因为在原生pg中,一个date减去另一个date的返回值,其类型是interval。因此在23.4版本中,LightDB对ceil函数做了增强,支持传入interval类型的参数,将interval类型中的天数先获取出来,这是个数值,再对其执行向上取整操作。
使用案例
--原有的对数值向上取整功能并不影响
lightdb@oracle=# select ceil(1.3);
ceil
------
2
(1 row)
lightdb@oracle=# select ceil(1.3*5);
ceil
------
7
(1 row)
lightdb@oracle=# select ceil(i) from generate_series(1,5) i;
ceil
------
1
2
3
4
5
(5 rows)
--当传入两个日期之差时
lightdb@oracle=# select ceil(sysdate - '2023-01-01'::date) FROM dual ;
ceil
------
335
(1 row)
lightdb@oracle=# select ceil(sysdate - to_date('2023-11-27','yyyy-mm-dd')) FROM dual;
ceil
------
5
(1 row)
lightdb@oracle=# select ceil(sysdate - to_date('2023-01-01','yyyy-mm-dd')) FROM dual;
ceil
------
335
(1 row)
--在存储过程中简单使用
lightdb@oracle=# SELECT dbms_output.serveroutput(true);
serveroutput
--------------
(1 row)
lightdb@oracle=# CREATE OR REPLACE PROCEDURE testproc()
lightdb@oracle-# IS
lightdb@oracle$# a date;
lightdb@oracle$# v number;
lightdb@oracle$# BEGIN
lightdb@oracle$# a := to_date('2023-11-30', 'yyyy-mm-dd');
lightdb@oracle$# select ceil(sysdate - a) into v from dual;
lightdb@oracle$# dbms_output.put_line('v=' || v );
lightdb@oracle$# END;
lightdb@oracle$# /
CREATE PROCEDURE
lightdb@oracle=# call testproc;
v=2
CALL