2017-07-21 4 views
0

Wie löst man dies in Oracle SQL?Suchen von Teilen eines Datumsbereiches für mehrere Tage innerhalb/außerhalb des Tages Variabler Bereich für Datumsbereich

1.I hat Columns Event_Min_DateTime (z. 2017.01.06 07.30.00) & Event_Max_datetime (z. 2017.03.06 18.30.00) ein event_id (zB ev001). So eine berechnete Spalte Event_minutes kann erstellt werden als (Event_Max_Datetime - Event_Min_DateTime) * 24 * 60.

  1. ich auch Daily_Window_Start (variable Zeitmarkenwert) und Daily_Window_End (variable Zeitmarkenwert) eines Daily_Date (Sequenziell täglich) Spalten haben. So kann eine berechnete Spalte Daily_Window_minutes berechnet werden als (Daily_Window_End - Daily_Window_Start) * 24 * 60. Hinweis: Daily_Window_minutes wird immer < = 1440 sein.

Nun, wie die Spalten Daily_portion_within (Teil des Event_minutes innerhalb Daily_Window_minutes fällt) und Daily_portion_outside berechnen (Teil des Event_minutes außerhalb Daily_Window_minutes fallen aber innerhalb der gleichen Daily_Date)?

Antwort

0

Es ist unklar von der Frage, ob Daily_Window_Start> Event_Min_DateTime sein kann, also hier habe ich in Erwägung gezogen, nur für solche Fälle zu schreiben, wo es nicht ist. Außerdem sind Datentypen von Spalten aus Ihrer Frage nicht ersichtlich und die Konvertierung wird nicht angewendet. Sie können Ihre Abfragen in die ähnlichen Zeilen für Daily_Window_Start> Event_Min_DateTime schreiben, wie unten angegeben. Es gibt jedoch viele Annahmen hier.

SELECT 
      CASE 
        WHEN e. event_max_datetime <= d.daily_window_end THEN (e.event_max_datetime - e.event_min_datetime)*24*60 
        ELSE (d.daily_window_end             - e.event_min_datetime)*24*60 
      END daily_portion_within , 
      CASE 
        WHEN e. event_max_datetime <= d.daily_window_end THEN NULL 
        ELSE (e.event_max_datetime - d.daily_window_end)*24*60 
      END daily_portion_outside 
    FROM (
        SELECT Trunc(event_max_datetime) dt , 
         event_min_datetime , 
         event_max_datetime 
        FROM EVENTS) EVENTS e, 
      daily_window d 
    WHERE e.dt = trunc(d.dt) 
0

sollte dieses Beispiel helfen:

select trunc(d1) as day, inside, (d2 - d1) * 24 * 60 - inside as outside 
    from (select e.*, d.*, 
       case when d2 < e1 or e2 < d1 then 0 
        else least(e2, d2) - greatest(e1, d1) 
       end * 24 * 60 as inside 
      from e cross join d) 

Daten:

create table e (id number(3), e1 date, e2 date); 
insert into e values(1, timestamp '2017-06-01 07:30:00', timestamp '2017-06-03 18:30:00'); 

create table d (d1 date, d2 date); 
insert into d values(timestamp '2017-06-01 06:00:00', timestamp '2017-06-01 15:30:00'); 
insert into d values(timestamp '2017-06-02 09:30:00', timestamp '2017-06-02 22:30:00'); 
insert into d values(timestamp '2017-06-03 12:05:00', timestamp '2017-06-03 19:45:00'); 
insert into d values(timestamp '2017-06-04 15:00:00', timestamp '2017-06-04 16:30:00'); 

Ergebnis:

DAY    INSIDE OUTSIDE 
----------- ---------- ---------- 
2017-06-01   480   90 
2017-06-02   780   0 
2017-06-03   385   75 
2017-06-04   0   90