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