您可以编写一个 PL/SQL 函数来解析字符串并输出流水线的日期集合:
甲骨文设置:
CREATE FUNCTION parseRRule(
rrule IN VARCHAR2,
start_date IN DATE
) RETURN SYS.ODCIDATELIST PIPELINED
IS
freq VARCHAR2(10) := UPPER( REGEXP_SUBSTR( rrule, '(^|;)FREQ=(MONTHLY|WEEKLY|DAILY|HOURLY)(;|$)', 1, 1, 'i', 2 ) );
inter NUMBER(4,0) := TO_NUMBER( REGEXP_SUBSTR( rrule, '(^|;)INTERVAL=(\d+)(;|$)', 1, 1, 'i', 2 ) );
cnt NUMBER(4,0) := TO_NUMBER( REGEXP_SUBSTR( rrule, '(^|;)COUNT=(\d+)(;|$)', 1, 1, 'i', 2 ) );
dt DATE := start_date;
step_ds INTERVAL DAY TO SECOND;
step_m NUMBER(3,0);
BEGIN
IF freq IS NULL OR inter IS NULL OR cnt IS NULL OR dt IS NULL THEN
RETURN;
END IF;
IF freq = 'MONTHLY' THEN
step_ds := INTERVAL '0' DAY;
step_m := inter;
ELSIF freq = 'WEEKLY' THEN
step_ds := inter * INTERVAL '7' DAY;
step_m := 0;
ELSIF freq = 'DAILY' THEN
step_ds := inter * INTERVAL '1' DAY;
step_m := 0;
ELSIF freq = 'HOURLY' THEN
step_ds := inter * INTERVAL '1' HOUR;
step_m := 0;
ELSE
NULL;
-- raise exception
END IF;
PIPE ROW ( dt );
FOR i IN 1 .. cnt - 1 LOOP
dt := ADD_MONTHS( dt + step_ds, step_m );
PIPE ROW ( dt );
END LOOP;
END;
/
查询:
SELECT *
FROM TABLE(
parseRRule(
rrule => 'FREQ=DAILY;INTERVAL=5;COUNT=10',
start_date => DATE '2019-01-01'
)
)
输出:
| COLUMN_VALUE |
| :----------- |
| 2019-01-01 |
| 2019-01-06 |
| 2019-01-11 |
| 2019-01-16 |
| 2019-01-21 |
| 2019-01-26 |
| 2019-01-31 |
| 2019-02-05 |
| 2019-02-10 |
| 2019-02-15 |
db<>在这里摆弄