【问题标题】:Loop through date range循环遍历日期范围
【发布时间】:2015-10-05 09:33:54
【问题描述】:

如何通过日期循环 Oracle 查询?我必须将变量放在 4 位。我的查询以 WITH AS 开头,所以我不能使用Oracle SQL Loop through Date Range 解决方案。

我也无法创建临时表。

这是我的尝试:

   WITH d 
AS (
    SELECT DATE'2015-06-22' + LEVEL - 1 AS current_d
       FROM dual
    CONNECT BY DATE'2015-06-22' + LEVEL - 1 < DATE'2015-10-04'
),
OrderReserve
AS (
    SELECT cvwarehouseid
        ,lproductid
        ,SUM(lqty) lqty
    FROM ABBICS.iOrdPrdQtyDate
    GROUP BY cvwarehouseid
        ,lproductid
    )
    SELECT 
    ...
    WHERE IORDREFILL.DNCONFIRMEDDELDATE < CAST(TO_CHAR(d.current_d , 'YYYYMMDD') AS NUMBER(38))
    ...

【问题讨论】:

  • 这里放一些例子..
  • 在上面的查询中Oracle不识别d.current_d
  • 在提供的示例中,您不需要日期范围。只需检查 IORDREFILL.DNCONFIRMEDDELDATE 是否小于该范围内的最高日期,您将在一次扫描中捕获所有行。
  • 您是否在 FROM 子句中提到了d

标签: oracle


【解决方案1】:

如果我理解正确,您假设每个查询只能使用 1 个内联表。这不是真的,您可以使用多个内联表并用另一个扩展现有的 WITH 子句来循环日期:

with OrderReserve as (
  SELECT cvwarehouseid
      ,lproductid
      ,SUM(lqty) lqty
  FROM ABBICS.iOrdPrdQtyDate
  GROUP BY cvwarehouseid
      ,lproductid    
), date_range as (
  select sysdate+level
  from dual
  connect by level <= 30
)
select *
from OrderReserve, date_range
... -- expand with date_range as you see fit
;

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2011-05-19
    • 2011-02-19
    • 2020-03-06
    • 1970-01-01
    • 2023-02-17
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多