查询将给出两个日期范围之间的日期列表

use*_*715 4 sql oracle oracle11g

我的问题类似于以下问题:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:14582643282111

区别在于我的内部查询返回两条记录,而我有外部查询。

我需要编写类似这样的内部查询,它会给我一个两个日期范围之间的日期列表(我正在尝试这个查询,但它不执行)。

Select * from outerTable where  my_date in
(   
    select to_date(r.REQ_DATE) + rownum -1
     from all_objects, (MY_INNER_QUERY Where ID =100) r 
     where rownum <= to_date(r.DUE_DATE,'dd-mon-yyyy')-to_date(r.REQ_DATE,'dd-mon-yyyy')+1;
)
Run Code Online (Sandbox Code Playgroud)

我的内部查询返回以下 2 行:

Select * from innerTable Where ID =100


    Start date           end date 
    3/19/2013            3/21/2013 
    3/8/2013             3/8/2013
Run Code Online (Sandbox Code Playgroud)

所以我需要内部查询,它将返回以下日期到外部查询:

    3/19/2013
    3/20/2013
    3/21/2013
    3/8/2013
Run Code Online (Sandbox Code Playgroud)

Ed *_*bbs 5

很好的问题——这个问题真的吸引了我!答案或多或少地隐藏在汤姆的帖子下面。这是简短的版本,使用名为 TestDR 的表来定义范围。首先是TestDR内容:

SELECT * FROM TestDR;

STARTDATE ENDDATE
--------- ---------
19-MAR-13 21-MAR-13
08-MAR-13 08-MAR-13
Run Code Online (Sandbox Code Playgroud)

现在,查询为范围内的每个日期创建一行:

WITH NUMS AS (
  SELECT LEVEL-1 DaysToAdd
  FROM DUAL
  CONNECT BY LEVEL <= 60
)
SELECT StartDate + DaysToAdd TheDate
FROM TestDR
CROSS JOIN NUMS
WHERE TestDR.EndDate - TestDR.StartDate + 1 > DaysToAdd
ORDER BY 1

THEDATE
---------
08-MAR-13
19-MAR-13
20-MAR-13
21-MAR-13
Run Code Online (Sandbox Code Playgroud)

通过根据 Tom 的帖子改编的查询,您必须知道“播种”查询的最大范围NUMS。他在示例中使用了 60,所以这就是我上面使用的。如果您认为子查询中的任何行的范围不会超过 60 天,那么这就能解决问题。如果您认为最大值可能高达 1000 天(大约三年),那么请将 60 更改为 1000。我尝试了此操作并查询了 2 1/2 年的范围,结果是即时的。

如果您想指定确切的“种子”计数,如果您愿意使查询更复杂一点,则可以计算它。以下是我如何用我的桌子做到这一点TestDR

WITH NUMS AS (
  SELECT LEVEL-1 DaysToAdd
  FROM DUAL
  CONNECT BY LEVEL <= (
    SELECT MAX(EndDate - StartDate + 1)
    FROM TestDR)
)
SELECT ... and the rest of the query as above
Run Code Online (Sandbox Code Playgroud)