在 Oracle 中生成时间段内有间隔的日期

Generate Dates in oracle with gaps during Time Period

我需要在特定时间段内生成日期(使用 Oracle SQL 开发人员 12 和 18)。 / 我找到了以下解决方案:

SELECT TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM - 1) DATEGEN
FROM ALL_OBJECTS
WHERE TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM -1) <=  TO_DATE('01/11/2020','DD/MM/YYYY')

我得到每日约会(如下所示):

01-JAN-20 12.00.00 AM 
02-JAN-20 12.00.00 AM 
03-JAN-20 12.00.00 AM 
04-JAN-20 12.00.00 AM 
05-JAN-20 12.00.00 AM 
06-JAN-20 12.00.00 AM

我需要获取间隔 5 天或 3 天的日期(示例):

01-JAN-20 12.00.00 AM

05-JAN-20 12.00.00 AM

10-JAN-20 12.00.00 AM

15-JAN-20 12.00.00 AM

有什么建议吗?! 提前致谢。

您可以使用具有简单逻辑的分层查询,如下所示:

SELECT DATE '2020-01-01' + ( LEVEL * 5 ) - 1
  FROM DUAL CONNECT BY
    LEVEL <= ( DATE '2020-11-01' - DATE '2020-01-01' ) / 5;

请注意,在你的问题中,前两个日期相差 4 天,在我的解决方案中,第一个日期为 05-01-2020

您可以使用标准递归查询:

with cte (dt) as (
    select date '2020-01-01' from dual
    union all
    select dt + interval '5' day from cte where dt < date '2020-01-15'
)
select * from cte order by dt

您可以根据需要调整边界,或者将它们移动到另一个cte:

with 
    params (startdt, enddt) as (
        select date '2020-01-01', date '2020-01-15' from dual
    ),
    cte (dt, enddt) as (
        select startdt dt, enddt from params
        union all
        select dt + interval '5' day, enddt from cte where dt < enddt
    )
select dt from cte order by dt     

请注意,您的示例数据中日期之间的间隔不是恒定的(前两个日期之间有 4 天,然后是 5 天。

您可能需要根据实际需要调整递归成员的 where 子句。在这里,最后一天可能是 1 月 15 日。如果您不希望这样,请将 where 子句更改为:

where dt + interval '5' day < enddt