2010-12-16 1 views
1

Позвольте мне объяснить, что я хочу: Есть некоторые компоненты, которые могут по каким-то причинам потерпеть неудачу, и у них есть приоритеты. Теперь я хочу, чтобы, если событие происходит и его приоритет низкий, я передам его время начала и времени окончания функции и посмотреть, есть ли какой-либо другой высокоприоритетный компонент, который был там в этот период время. Если бы не было, то есть четыре случая:Написание функции Oracle, чтобы вернуть время события, если оно не находится в другом событии

  1. Если событие низкого приоритета в сроках высокого приоритета события, то время 0.

  2. Если время окончания мероприятия в высокий приоритет, но время начала выходит за пределы приоритета, а не времени вне события.

  3. Если время начала события находится в высоком приоритете, но время окончания - это высокий приоритет, а не время вне события.

  4. как начало, так и конец являются выходными, означает высокий приоритет между событием с низким приоритетом.

Пример: Предположим, что каждое событие имеет высокий приоритет. Я отправляю время начала и окончания, например. 12:41:01 и 12:49:01

component start time end time 
1   12:40:01 12:50:01 result will be 0 because it's between the start & end 
2   12:40:01 12:48:01 result will be 1 minute 
3   12:43:01 12:50:01 result will be 2 minutes 
4   12:43:01 12:44:01 result will be 7 minutes 

Я хочу функцию, чтобы отправить меня обратно время в секундах. Я должен сравнивать его с каждым компонентом все время, и я не знаю, как это сделать в функции, а не только в функции.

+4

Примите дополнительную осторожность, задав свой вопрос, если вы хотите помочь. Формулировка с двигателем, необоснованные предложения и отсутствие ясности не заставят вас очень далеко: «.. посмотрите, есть ли какой-то другой высокоприоритетный компонент, который был там, в тот период, когда это было тогда, есть четыре случая ... " – Tim 2010-12-16 22:34:26

+2

-1 для полностью неструктурированного текста и текста – 2010-12-16 22:46:29

ответ

2

Учитывая определение следующей таблице

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; 

Делитесь и наслаждайтесь.

0

Описание, похоже, не имеет смысла, но я думаю, что это то, что вы можете искать (предполагая, что start_time_in и end_time_in - это имена ваших входных переменных).

select component, ((start_time - least(start_time, start_time_in)) + (greatest(end_time, end_time_in) - end_time)) * 24*60*60 seconds_outside_window 
from table 
Смежные вопросы