给定下表定义
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;
分享和享受。