生成两个给定日期之间的日期并在PL/SQL中循环

生成两个给定日期之间的日期并在PL/SQL中循环,sql,oracle,Sql,Oracle,我对PL/SQL非常陌生。我在Oracle数据库中创建了一个表,根据该表,我必须生成一份报告,以显示从2013年5月1日到2013年5月31日的开放bug数量,并且在报告结束时,需要使用PL/SQL匿名块显示单日开放bug的最大数量。 表定义和数据如下: CREATE TABLE bugs ( BUG_ID NUMBER PRIMARY KEY, REPORTED_DATE DATE NOT NULL, DESCRIPTION VARCHAR2(20), PRIOR

我对PL/SQL非常陌生。我在Oracle数据库中创建了一个表,根据该表,我必须生成一份报告,以显示从2013年5月1日到2013年5月31日的开放bug数量,并且在报告结束时,需要使用PL/SQL匿名块显示单日开放bug的最大数量。 表定义和数据如下:

CREATE TABLE bugs
(
BUG_ID          NUMBER PRIMARY KEY,
REPORTED_DATE   DATE NOT NULL,
DESCRIPTION     VARCHAR2(20),
PRIORITY        NUMBER(2),
ASSIGNED_TO     VARCHAR2(10),
CLOSED_DATE     DATE,
NOTE            VARCHAR2(20)
);

INSERT INTO BUGS VALUES (1230, '25-APR-13', NULL, 3, 'Team 3', '28-APR-13', NULL); 
INSERT INTO BUGS VALUES (1231, '29-APR-13', NULL, 1, 'Team 1', '29-APR-13', NULL); 
INSERT INTO BUGS VALUES (1232, '03-MAY-13', NULL, 1, 'Team 1', '03-MAY-13', NULL); 
INSERT INTO BUGS VALUES (1233, '03-MAY-13', NULL, 1, 'Team 3', '08-MAY-13', NULL);
INSERT INTO BUGS VALUES (1234, '04-MAY-13', NULL, 2, 'Team 5', '15-MAY-13', NULL);
INSERT INTO BUGS VALUES (1235, '04-MAY-13', NULL, 2, 'Team 1',  NULL,       NULL);
INSERT INTO BUGS VALUES (1236, '05-MAY-13', NULL, 1, 'Team 2', '06-MAY-13', NULL);
INSERT INTO BUGS VALUES (1237, '05-MAY-13', NULL, 3, 'Team 3', '10-MAY-13', NULL);
INSERT INTO BUGS VALUES (1238, '09-MAY-13', NULL, 4, 'Team 5', '16-MAY-13', NULL);
INSERT INTO BUGS VALUES (1239, '09-MAY-13', NULL, 5, 'Team 6',  NULL,       NULL);
INSERT INTO BUGS VALUES (1240, '12-MAY-13', NULL, 5, 'Team 2', '30-MAY-13', NULL);
INSERT INTO BUGS VALUES (1241, '12-MAY-13', NULL, 1, 'Team 1', '20-MAY-13', NULL);
INSERT INTO BUGS VALUES (1242, '13-MAY-13', NULL, 4, 'Team 4', '25-MAY-13', NULL);
INSERT INTO BUGS VALUES (1243, '14-MAY-13', NULL, 4, 'Team 3', '01-JUN-13', NULL);
INSERT INTO BUGS VALUES (1244, '14-MAY-13', NULL, 2, 'Team 4', '25-MAY-13', NULL);
INSERT INTO BUGS VALUES (1245, '20-MAY-13', NULL, 2, 'Team 4',  NULL,       NULL);
INSERT INTO BUGS VALUES (1246, '22-MAY-13', NULL, 2, 'Team 4', '25-MAY-13', NULL);
INSERT INTO BUGS VALUES (1247, '25-MAY-13', NULL, 2, 'Team 1', '29-MAY-13', NULL);
INSERT INTO BUGS VALUES (1248, '30-MAY-13', NULL, 1, 'Team 1', '01-JUN-13', NULL);
INSERT INTO BUGS VALUES (1249, '05-JUN-13', NULL, 1, 'Team 2', '07-JUN-13', NULL);
COMMIT;
“打开的bug”-如果1其“报告的bug日期”在某一天或之前,2其“关闭的bug日期”在该天或之后,或未知为空,则该bug被视为在某一天打开。例如,2013年5月5日,我们有5个未解决的bug

程序的输出应如下所示:

Date      Number of Open Bugs   
01-MAY-13            0
02-MAY-13            0
03-MAY-13            2  
04-MAY-13            3
05-MAY-13            5
06-MAY-13            5
07-MAY-13            4
08-MAY-13            4
---------            --
---------            --

The maximum number of open bugs on a single day is 9.
There were 9 open bugs on 14-MAY-13.
There were 9 open bugs on 15-MAY-13.
There were 9 open bugs on 25-MAY-13.

我搜索并发现有ADD_MONTHS和CONNECT_BY_级别的函数,我可以使用它们来生成月内的天数列表,然后使用循环来计算月内特定日期的开放bug,但不知道如何准确使用它们。有人能帮我开始吗。提前感谢。

每天获取打开的bug相当简单,使用纯SQL,因此不需要PL/SQL:

with dates as (
  select date '2013-05-01' + level - 1 as q_date
  from dual
  connect by level <= date '2013-05-01' + interval '1' month
    - date '2013-05-01'
)
select d.q_date,
  count(case when b.reported_date < d.q_date + 1
      and (b.closed_date is null or b.closed_date >= d.q_date)
    then 1 end) as open_bugs
from dates d
cross join bugs b
group by d.q_date
order by d.q_date;


输出的第二部分可以通过运行同一查询三次并调整所选内容来完成,但这似乎是浪费。您可以使用一个块将此数据查询到集合中一次,然后使用该块显示列表、顶部计数以及与该计数匹配的日期。

每天获取打开的Bug非常简单,使用纯SQL,因此不需要PL/SQL:

with dates as (
  select date '2013-05-01' + level - 1 as q_date
  from dual
  connect by level <= date '2013-05-01' + interval '1' month
    - date '2013-05-01'
)
select d.q_date,
  count(case when b.reported_date < d.q_date + 1
      and (b.closed_date is null or b.closed_date >= d.q_date)
    then 1 end) as open_bugs
from dates d
cross join bugs b
group by d.q_date
order by d.q_date;


输出的第二部分可以通过运行同一查询三次并调整所选内容来完成,但这似乎是浪费。您可以使用块将此数据查询到集合中一次,然后使用该块显示列表、顶部计数以及与该计数匹配的日期。

使用您提供的数据:

问题1:

with dates as (select to_date('01-MAY-2013', 'DD-MON-YYYY') + level - 1 d_date
                 from dual
               connect by level <= add_months(to_date('01-MAY-2013', 'DD-MON-YYYY'), 1)
                                   - to_date('01-MAY-2013', 'DD-MON-YYYY'))
select d_date, count(bug_id) NO_OF_OPEN_BUGS
  from dates
  left outer join bugs on (d_date between REPORTED_DATE and nvl(CLOSED_DATE, d_date))
group by d_date
order by d_date
问题2:

with dates as (select to_date('01-MAY-2013', 'DD-MON-YYYY') + level - 1 d_date
                 from dual
               connect by level <= add_months(to_date('01-MAY-2013', 'DD-MON-YYYY'), 1)
                                - to_date('01-MAY-2013', 'DD-MON-YYYY')),
tab as (select d_date, count(bug_id) NO_OF_OPEN_BUGS, dense_rank() over (order by count(bug_id) desc) MAX_FLAG
  from dates
  left outer join bugs on (d_date between REPORTED_DATE and nvl(CLOSED_DATE, d_date))
group by d_date)
select 'There were ' || NO_OF_OPEN_BUGS || 
       ' open bugs on '|| to_char(d_date, 'DD-MON-YYYY') ||
       '.' MSG from 
   tab where max_flag = 1;

查询1中的信息用于生成查询2。

使用您提供的数据:

问题1:

with dates as (select to_date('01-MAY-2013', 'DD-MON-YYYY') + level - 1 d_date
                 from dual
               connect by level <= add_months(to_date('01-MAY-2013', 'DD-MON-YYYY'), 1)
                                   - to_date('01-MAY-2013', 'DD-MON-YYYY'))
select d_date, count(bug_id) NO_OF_OPEN_BUGS
  from dates
  left outer join bugs on (d_date between REPORTED_DATE and nvl(CLOSED_DATE, d_date))
group by d_date
order by d_date
问题2:

with dates as (select to_date('01-MAY-2013', 'DD-MON-YYYY') + level - 1 d_date
                 from dual
               connect by level <= add_months(to_date('01-MAY-2013', 'DD-MON-YYYY'), 1)
                                - to_date('01-MAY-2013', 'DD-MON-YYYY')),
tab as (select d_date, count(bug_id) NO_OF_OPEN_BUGS, dense_rank() over (order by count(bug_id) desc) MAX_FLAG
  from dates
  left outer join bugs on (d_date between REPORTED_DATE and nvl(CLOSED_DATE, d_date))
group by d_date)
select 'There were ' || NO_OF_OPEN_BUGS || 
       ' open bugs on '|| to_char(d_date, 'DD-MON-YYYY') ||
       '.' MSG from 
   tab where max_flag = 1;
查询1中的信息用于生成查询2