2016-04-30 9 views
1

mit habe ich eine Tabelle, die zwei Zeitstempel t1 (Ereignis offen Datum) und t2 (Ereignis Abschlussdatum) und einen Primärschlüssel eventid enthält.Oracle Zeitstempel basierte Berechnung an jedem Tag zwei Datetime-Spalte

Wenn Ereignis geöffnet ist dann t2 wird null sein, wenn sogar die gleiche Zeile geschlossen wird wird mit Ereigniseinreichungsfrist t2 aktualisiert werden werden. Zum Beispiel möchte ich, wie viele Fragen offen (t1) an jedem Tag basiert auf geöffnetem Datum von 01-apr-2016 zu 10-apr-2016 überprüfen.

Ich muss berechnen, wie viele Ereignisse für jeden Tag basierend auf einem ausgewählten Datumsbereich geöffnet sind. Lassen Sie uns sagen, wenn eventid 1 auf 1.-April und wurde geschlossen 10. April und ich bin der Berechnung der Anzahl der geöffneten Themen für jeden Tag auf 11. April dann sollte es geben mir Anzahl offener geöffnet wurde Ereignis 1 vom 1. April bis zum 10. April.

Tabellenstruktur: -

================================================ 
    EVENTID   T1    T2 
================================================ 
     1   01-apr-2016  10-apr-2016 
     2   02-apr-2016  08-apr-2016 
     3   05-apr-2016  09-apr-2016 

Erwartete Ausgabe: -

============================================================================== 
     DATE   TOTAL_OPEN_EVENTS 
============================================================================== 
    01-apr-2016   1 
    02-apr-2016   2(1 issue open on 1st(not closed on 2nd) and 1 on 2nd) 
    03-apr-2016   2 
    04-apr-2016   2 
    05-apr-2016   3 
    06-apr-2016   3 
    07-apr-2016   3 
    08-apr-2016   2(1 issue got closed on 8th(which was opened on 2nd)) 
    09-apr-2016   2 
    10-apr-2016   0 

Wie diese Art der Berechnung in Oracle-Datenbank zu tun?

+0

Bitte zeigen Sie Beispieltabellendaten und erwartete Ausgabe an. – OldProgrammer

+0

@OldProgrammer Tabellenstruktur und erwartete Ausgabe hinzugefügt. –

+0

Sollte nicht am 09. April 2016 zählen 1, nicht 2? Event # 3 ist geschlossen. – OldProgrammer

Antwort

2

Um den Endbericht zu generieren, benötigen Sie für jedes Datum in Ihrem gewünschten Bereich eine Zeile. Sie können entweder eine Kalendertabelle verwenden, falls verfügbar, oder ich finde, dass die Verwendung einer Abfrage unter DUAL mit CONNECT BY LEVEL < some_number funktioniert, um Zeilen im laufenden Betrieb zu generieren. (In diesem Fall „some_number“ wird die Anzahl der Tage, die Sie melden möchten.) Von dort müssen Sie nur die einzelnen Termine zu den Datumsbereiche in der Ereignistabelle beitreten:

-- create table "events" table 
create table event_date_ranges 
as 
select 1 as event_id, TO_DATE('2016-APR-01', 'YYYY-MM-DD') as start_date, TO_DATE('2016-APR-10', 'YYYY-MON-DD') as end_date from dual 
union all 
select 2 as event_id, TO_DATE('2016-APR-02', 'YYYY-MM-DD') as start_date, TO_DATE('2016-APR-08', 'YYYY-MON-DD') as end_date from dual 
union all 
select 3 as event_id, TO_DATE('2016-APR-05', 'YYYY-MM-DD') as start_date, TO_DATE('2016-APR-09', 'YYYY-MON-DD') as end_date from dual 
; 


with 
date_range_qry as 
(-- one way to set the start and end dates for your report 
select TO_DATE('2016-APR-01', 'YYYY-MM-DD') as report_start_date 
     , TO_DATE('2016-APR-10', 'YYYY-MM-DD') as report_end_date 
    from dual 
) 
, dates_qry 
as 
(
-- generate a row for all dates between 2016-APR-01 and 2016-APR-10 
select report_start_date + ROWNUM - 1 as report_date 
from dual 
    cross join 
    date_range_qry drq 
connect by level <= (drq.report_end_date - drq.report_start_date + 1) 
) 
select dq.report_date, count(edr.event_id) as total_open_events 
    from dates_qry dq 
     left outer join 
     event_date_ranges edr 
      on dq.report_date >= edr.start_date 
      and dq.report_date < edr.end_date 
group by dq.report_date 
order by dq.report_date 

Ausgang:

REPORT_DATE  TOTAL_OPEN_EVENTS 
2016-APR-01  1 
2016-APR-02  2 
2016-APR-03  2 
2016-APR-04  2 
2016-APR-05  3 
2016-APR-06  3 
2016-APR-07  3 
2016-APR-08  2 
2016-APR-09  1 
2016-APR-10  0 
0

Sie können dies versuchen:

create table events_log 
as 
select 1 as event_id, TO_DATE('01-04-2016', 'DD/MM/YYYY') as T1, TO_DATE('10-04-2016', 'DD/MM/YYYY') as T2 from dual 
union all 
select 2 as event_id, TO_DATE('02-04-2016', 'DD/MM/YYYY') as T1, TO_DATE('08-04-2016', 'DD/MM/YYYY') as T2 from dual 
union all 
select 3 as event_id, TO_DATE('05-04-2016', 'DD/MM/YYYY') as T1, TO_DATE('09-04-2016', 'DD/MM/YYYY') as T2 from dual 
; 
-------------- 

select v.REPORT_DATE, count(t.EVENT_ID) as open_event 
    from events_log t, 
     (select to_date('01/04/2016', 'DD/MM/YYYY') + ROWNUM - 1 as report_date 
      from dual 
     connect by level <= (to_date('11/04/2016', 'DD/MM/YYYY') - 
        to_date('01/04/2016', 'DD/MM/YYYY') + 1)) v 
where t.T1(+) <= v.report_date 
    and t.T2(+) >= v.report_date 
group by v.report_date 
order by v.report_date; 

Output wi ll be:

report_date open_event 
01/04/2016 1 
02/04/2016 2 
03/04/2016 2 
04/04/2016 2 
05/04/2016 3 
06/04/2016 3 
07/04/2016 3 
08/04/2016 3 
09/04/2016 2 
10/04/2016 1 
11/04/2016 0 
Verwandte Themen