1

私が望むことを説明させてください。いくつかの理由で失敗する可能性のあるコンポーネントがいくつかあり、それらには優先順位があります。ここで、イベントが発生し、その優先度が低い場合、その開始時刻終了時刻を関数に渡し、その期間に他の優先度の高いコンポーネントが存在するかどうかを確認します。ある場合、次の 4 つのケースがあります。

  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 に答える