【问题标题】:Generate Dates in oracle with gaps during Time Period在时间段内在 oracle 中生成有间隔的日期
【发布时间】:2021-02-17 00:15:23
【问题描述】:

我需要在特定时间段内生成日期(使用 Oracle SQL Developer 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

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

【问题讨论】:

  • 为什么第一个间隔是4天?
  • 误会了!!,, 必须是 31 - Dec - 19

标签: sql oracle datetime oracle11g oracle10g


【解决方案1】:

您可以使用简单逻辑的层次结构查询,如下所示:

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

【讨论】:

  • Grate!.. ThanQ U
【解决方案2】:

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

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

【讨论】:

  • 属解决方案!.. ThanQ 你.. 我不知道如何使用!
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多