oracle 用于生成日期间隔的Generuc函数

bq3bfh9z  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(144)

我把下面的代码交给了几个QA团队,它们工作得很好。

with dt (dt, interv) as (
select TIMESTAMP '2022-11-01 02:37:11', numtodsinterval(5,'MINUTE') from dual
union all
select dt.dt + interv, interv from dt
where dt.dt + interv <
TIMESTAMP '2022-11-01 05:00:00')
select dt from dt;

问题是值是硬编码的,当一个人修改以放置不同的值时,他们经常会在编辑时出错,这会导致代码失败。
是否可以将此代码修改为管道函数或带有out参数或宏的过程,以防止出现此类问题。
我需要输入2个日期(输入的日期顺序不应该把事情搞砸。也许可以使用least(),greatest()),一个INTERVAL 'N'和一个单位S=second M=MINUTE H=hour或者D=Day。
感谢所有的回答和你的专业知识。

brtdzjyr

brtdzjyr1#

作为宏:

CREATE OR REPLACE FUNCTION gen_dt(i_from_dat IN TIMESTAMP, i_to_dat IN TIMESTAMP, i_interval IN NUMBER, i_interval_type IN VARCHAR2)
RETURN VARCHAR2
SQL_MACRO
IS
BEGIN
    RETURN q'~SELECT LEAST(i_from_dat,i_to_dat) + NUMTODSINTERVAL( (LEVEL-1)*i_interval, i_interval_type ) AS dt
    FROM DUAL
    CONNECT BY LEAST(i_from_dat,i_to_dat)  + NUMTODSINTERVAL( (LEVEL-1)*i_interval, i_interval_type) < GREATEST(i_from_dat, i_to_dat)~';
END ;

(Note您不能使用WITH子句,因为有一个错误阻止在WITH()部分内替换变量)

SELECT * FROM gen_dt(SYSTIMESTAMP, SYSTIMESTAMP+1, 4, 'HOUR') ;

03/11/22 13:48:23,072872000
03/11/22 17:48:23,072872000
03/11/22 21:48:23,072872000
04/11/22 01:48:23,072872000
04/11/22 05:48:23,072872000
04/11/22 09:48:23,072872000

相关问题