1

让我解释一下我想要什么:有些组件可能由于某些原因而失败,并且它们具有优先级。现在,我想要的是,如果一个事件发生并且它的优先级很低,我会将它的开始时间结束时间传递给函数,看看在那个时间段内是否还有其他一些高优先级的组件。如果有,那么有四种情况:

  1. 如果低优先级事件在高优先级事件的时序中,则时间为 0。

  2. 如果事件的结束时间处于高优先级,但开始时间在高优先级之外,则在事件之外的时间。

  3. 如果事件的开始时间处于高优先级,但结束时间在高优先级之外,则在事件之外的时间。

  4. start 和 end 都出意味着高优先级在低优先级事件之间。

示例:假设每个事件都具有高优先级。我正在发送开始时间和结束时间,例如12:41:0112: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

2 回答 2

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;

分享和享受。

于 2010-12-17T13:36:57.747 回答
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
于 2010-12-17T20:15:41.947 回答