С учетом следующего определения таблицы
CREATE TABLE EVENT_OCCURRENCE
(COMPONENT NUMBER PRIMARY KEY,
PRIORITY VARCHAR2(6) NOT NULL
CHECK(PRIORITY IN ('HIGH', 'MEDIUM', 'LOW')),
START_TIME DATE NOT NULL,
END_TIME DATE NOT NULL);
со следующими данными
INSERT INTO EVENT_OCCURRENCE (COMPONENT, PRIORITY, START_TIME, END_TIME)
VALUES (1, 'HIGH', TRUNC(SYSDATE) + INTERVAL '0 12:40:01' DAY TO SECOND, TRUNC(SYSDATE) + INTERVAL '0 12:50:01' DAY TO SECOND);
INSERT INTO EVENT_OCCURRENCE (COMPONENT, PRIORITY, START_TIME, END_TIME)
VALUES (2, 'HIGH', TRUNC(SYSDATE) + INTERVAL '0 12:45:01' DAY TO SECOND, TRUNC(SYSDATE) + INTERVAL '0 12:48:01' DAY TO SECOND);
INSERT INTO EVENT_OCCURRENCE (COMPONENT, PRIORITY, START_TIME, END_TIME)
VALUES (3, 'HIGH', TRUNC(SYSDATE) + INTERVAL '0 12:39:01' DAY TO SECOND, TRUNC(SYSDATE) + INTERVAL '0 12:46:01' DAY TO SECOND);
INSERT INTO EVENT_OCCURRENCE (COMPONENT, PRIORITY, START_TIME, END_TIME)
VALUES (4, 'HIGH', TRUNC(SYSDATE) + INTERVAL '0 12:38:01' DAY TO SECOND, TRUNC(SYSDATE) + INTERVAL '0 12:55:01' DAY TO SECOND);
следующая процедура НЕ даст результатов, о которых вы просили, но, учитывая, что в вашем объяснении не хватает подробностей, я думаю, это лучшее, на что вы можете надеяться. Это должно дать вам что-то, с чего можно начать, чтобы получить то, что вы думаете:
CREATE OR REPLACE PROCEDURE PRINT_INTERSECTING_OCCURRENCES(dtEvent_start IN DATE,
dtEvent_end IN DATE) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('dtEvent_start=' || TO_CHAR(dtEvent_start, 'DD-MON-YYYY HH24:MI:SS') ||
' dtEvent_end=' || TO_CHAR(dtEvent_end, 'DD-MON-YYYY HH24:MI:SS'));
FOR aRow IN (SELECT E.*,
CASE
WHEN dtEvent_start >= E.START_TIME
AND dtEvent_end <= E.END_TIME
THEN
0
WHEN dtEvent_start < E.START_TIME
AND dtEvent_end BETWEEN E.START_TIME AND E.END_TIME
THEN
(E.START_TIME - dtEvent_start) * (24 * 60 * 60)
WHEN dtEvent_start BETWEEN E.START_TIME AND E.END_TIME
AND dtEvent_end > E.END_TIME
THEN
(dtEvent_end - E.END_TIME) * (24 * 60 * 60)
WHEN dtEvent_start > E.END_TIME
OR dtEvent_end < E.START_TIME
THEN
(dtEvent_end - dtEvent_start) * (24 * 60 * 60)
ELSE
((E.START_TIME - dtEvent_start) * (24 * 60 * 60))
+ ((dtEvent_end - E.END_TIME) * (24 * 60 * 60))
END AS TIME_DIFF
FROM EVENT_OCCURRENCE E
WHERE E.PRIORITY = 'HIGH')
LOOP
DBMS_OUTPUT.PUT_LINE('COMPONENT=' || aRow.COMPONENT ||
' PRIORITY=' || aRow.PRIORITY ||
' START_TIME=' || TO_CHAR(aRow.START_TIME, 'DD-MON-YYYY HH24:MI:SS') ||
' END_TIME=' || TO_CHAR(aRow.END_TIME, 'DD-MON-YYYY HH24:MI:SS') ||
' TIME_DIFF=' || aRow.TIME_DIFF);
END LOOP;
END PRINT_INTERSECTING_OCCURRENCES;
Делись и наслаждайся.