一尘不染

如何在PL / SQL中遍历日期范围

sql

我需要编写一个报告,该报告针对具有每个记录的日期范围的表生成汇总总数。

table data:
option   start_date   end_date
opt1     6/12/2009    6/19/2009
opt1     6/3/2009     6/13/2009
opt2     6/5/2009     6/6/2009

我想要的基本上是这样的:

date       option    count
6/1/2009   opt1      0
6/1/2009   opt2      0
6/2/2009   opt1      0
6/2/2009   opt2      0
6/3/2009   opt1      0
6/3/2009   opt2      1

我很难弄清楚如何遍历日期范围。我确信这是可以为此创建的一些简单游标,但是我很茫然。最好在PL / SQL中

更新:

我最终在这里使用示例来完成我想做的事情。这将创建一个生成日期表的函数。


阅读 195

收藏
2021-03-17

共1个答案

一尘不染

您将需要某种日历来遍历日期范围。我已经使用“按级别连接”技巧构建了一个。然后,您可以将日历与您的数据结合起来(交叉结合,因为即使在当天没有选择的情况下,您也希望连续一行):

SQL> WITH calendar AS (
  2     SELECT to_date(:begin_date, 'mm/dd/yyyy') + ROWNUM - 1 c_date
  3       FROM dual
  4      CONNECT BY LEVEL <= to_date(:end_date, 'mm/dd/yyyy') 
                             - to_date(:begin_date, 'mm/dd/yyyy') + 1
  5  )
  6  SELECT c_date "date", d_option "option", COUNT(one_day)
  7    FROM (SELECT c.c_date, d.d_option,
  8                  CASE
  9                     WHEN c.c_date BETWEEN d.start_date AND d.end_date THEN
 10                      1
 11                  END one_day
 12             FROM DATA d, calendar c)
 13   GROUP BY c_date, d_option
 14  ORDER BY 1,2;

date        option COUNT(ONE_DAY)
----------- ------ --------------
01/06/2009  opt1                0
01/06/2009  opt2                0
02/06/2009  opt1                0
02/06/2009  opt2                0
03/06/2009  opt1                1
03/06/2009  opt2                0
04/06/2009  opt1                1
04/06/2009  opt2                0
05/06/2009  opt1                1
05/06/2009  opt2                1
06/06/2009  opt1                1
06/06/2009  opt2                1

12 rows selected
2021-03-17