【问题标题】:generating range of dates table with rownum [duplicate]使用rownum生成日期表范围[重复]
【发布时间】:2022-01-25 04:51:35
【问题描述】:

我正在尝试创建一个客户端级别的报告,它将从指定了 client_id 的客户端表中获取诸如 start_date 和 end_date 之类的信息。之后的想法是根据客户端 start_date 和 end_date 生成可能在范围内谨慎的日期表。

我的问题:是否可以在查询执行时(动态)创建具有日期范围的表?

或者:您可以像使用 for 循环那样制作数字序列,而无需事先定义临时表或辅助程序吗?

例如(oracle SQL):

SELECT  *
FROM    (   SELECT  1   A
            FROM    DUAL    )   A

LEFT JOIN    (  SELECT  10  B
                FROM    DUAL    )   B ON B.B = A.A + ROWNUM

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    您可以为此目的使用recursive CTE

    您只需要在 anchor 的 select 中传递 start 日期和 stop 日期 递归 CTE

    例子

    with cal (dt, stop) as (
    select date'2022-01-01', date'2022-01-05' from dual
    union all
    select dt+1, stop from cal
    where dt< stop)
    select dt from cal;
    
    DT                 
    -------------------
    01.01.2022 00:00:00
    02.01.2022 00:00:00
    03.01.2022 00:00:00
    04.01.2022 00:00:00
    05.01.2022 00:00:00
    

    【讨论】:

      【解决方案2】:

      您可以使用connect by level 语法:

      SELECT     TO_DATE('01/02/03', 'DD/MM/RR') + LEVEL - 1 -- Some arbitrary start date
      FROM       dual
      CONNECT BY LEVEL <= 10 -- Arbitrarily produce 10 rows
      

      【讨论】:

        【解决方案3】:

        在我看来像一个普通的分层查询。

        SQL> with cal (dt, stop) as
          2    (select date'2022-01-01', date'2022-01-05' from dual)
          3  select dt + level - 1 datum
          4  from cal
          5  connect by level <= stop - dt + 1;
        
        DATUM
        ----------
        01.01.2022
        02.01.2022
        03.01.2022
        04.01.2022
        05.01.2022
        
        SQL>
        

        【讨论】:

          猜你喜欢
          • 2019-01-30
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-17
          • 2011-12-11
          • 2021-02-10
          相关资源
          最近更新 更多