Создание таблицы с примерами:
SQL> create table mytable (batchid,starttime,endtime)
2 as
3 select 12957, '10:15', '10:25' from dual union all
4 select 13032, '10:16', '10:20' from dual union all
5 select 13080, '10:16', '10:22' from dual union all
6 select 13090, '10:16', '10:20' from dual union all
7 select 13214, '10:19', '10:30' from dual union all
8 select 13232, '10:19', '10:22' from dual union all
9 select 13276, '10:19', '10:29' from dual union all
10 select 13279, '10:19', '10:30' from dual union all
11 select 13315, '10:20', '10:23' from dual union all
12 select 13341, '10:20', '10:24' from dual union all
13 select 13430, '10:22', '10:33' from dual union all
14 select 13566, '10:27', '10:30' from dual union all
15 select 13580, '10:27', '10:31' from dual union all
16 select 13585, '10:28', '10:31' from dual union all
17 select 13596, '10:28', '10:32' from dual union all
18 select 13626, '10:30', '10:42' from dual union all
19 select 13637, '10:32', '10:35' from dual union all
20 select 13699, '10:40', '10:44' from dual union all
21 select 13702, '10:41', '10:45' from dual
22 /
Table created.
Представляя начало и конец интервала, о котором вы хотите сообщить, в качестве переменных связывания. Вы можете распознать использование переменных связывания в SQL и PL / SQL по их ведущим двоеточиям.
SQL> var START_X_AXIS varchar2(5)
SQL> var END_X_AXIS varchar2(5)
SQL> begin
2 :START_X_AXIS := '10:15';
3 :END_X_AXIS := '10:41';
4 end;
5 /
PL/SQL procedure successfully completed.
И запрос, который выполняется в три этапа для ясности. Сначала преобразуйте ваш varchar2 в реальные даты (кстати, советую хранить их и так). Второй запрос показывает все минуты на оси X для вашего отчета. Третий подсчитывает.
SQL> with mytable_with_real_dates as
2 ( select batchid
3 , to_date(starttime,'hh24:mi') starttime
4 , to_date(endtime,'hh24:mi') endtime
5 from mytable
6 )
7 , all_minutes as
8 ( select to_date(:START_X_AXIS,'hh24:mi') + numtodsinterval(level-1,'minute') minute
9 from dual
10 connect by level <= 24 * 60 * (to_date(:END_X_AXIS,'hh24:mi') - to_date(:START_X_AXIS,'hh24:mi')) + 1
11 )
12 select to_char(m.minute,'hh24:mi')
13 , count(t.batchid)
14 from all_minutes m
15 left outer join mytable_with_real_dates t on (m.minute between t.starttime and t.endtime)
16 group by m.minute
17 order by m.minute
18 /
TO_CH COUNT(T.BATCHID)
----- ----------------
10:15 1
10:16 4
10:17 4
10:18 4
10:19 8
10:20 10
10:21 8
10:22 9
10:23 7
10:24 6
10:25 5
10:26 4
10:27 6
10:28 8
10:29 8
10:30 8
10:31 5
10:32 4
10:33 3
10:34 2
10:35 2
10:36 1
10:37 1
10:38 1
10:39 1
10:40 2
10:41 3
27 rows selected.
РЕДАКТИРОВАТЬ: Я только что видел ваш комментарий, что ваши столбцы хранятся как даты. Это хорошая новость, поэтому вы можете пропустить первую часть и начать со строки № 7, заменив запятую словом «WITH».
С уважением,
Роб.