2016-06-02 3 views
1

Ich habe eine Tabelle, die Benutzer System Login-Informationen enthält.Oracle SQL durchlaufen Daten

Ich möchte über "out of hours" -Aktivitäten berichten - Zeiten werden zwischen 20:00 und 06:00 am nächsten Tag angegeben.

kann ich eine einfache Abfrage ausführen, die die Informationen zurückgibt ich brauche:

select to_char(logon_time, 'YYYY-MM-DD HH24:MI') , 
username from sessions 
where to_char(logon_time, 'YYYY-MON-DD HH24:MI') 
between '&YEAR-&MONTH-01 20:00' and '&YEAR-&MONTH-02 06:00'; 

Bitte beachte, dass ich manuell einzelne ‚Tage‘ in dieser Abfrage definieren - in diesem Fall ist es von 20:00 auf das ist 01. bis 06.00 Uhr am 02. Tag des Monats.

Was ich tun möchte, ist einen Bericht für einen großen Datumsbereich (zum Beispiel den Beginn des Jahres bis zu SYSDATE), automatisch über die einzelnen Tage iterieren unter Berücksichtigung der Tatsache, dass die Unterabfrage bereits hat eine Spezifikation zwischen der Datumsbereichsklausel, die sich über mehrere Tage erstreckt.

Ich kann mir nicht vorstellen, wie dies zu erreichen ist. Irgendwelche Hinweise sehr geschätzt!

+0

Wenn Sie uns einige Beispieldaten zeigen könnten, wäre es nett. Ein Bild sagt mehr als tausend Worte für SQL-Fragen. –

+0

Sie können den Zeitabschnitt und die Datumsabschnitte als separate Bedingungen vergleichen. – mo2

Antwort

2

Sie können alle Out-of-Stunden identifizieren Anmeldungen mit:

SELECT logon_time, 
     username 
FROM sessions 
WHERE EXTRACT(HOUR FROM CAST(logon_time AS TIMESTAMP)) < 6 
OR  EXTRACT(HOUR FROM CAST(logon_time AS TIMESTAMP)) >= 20 

Wenn Sie es für einen bestimmten Zeitraum anzeigen möchten, dann:

SELECT logon_time, 
     username 
FROM sessions 
WHERE ( EXTRACT(HOUR FROM CAST(logon_time AS TIMESTAMP)) < 6 
     OR EXTRACT(HOUR FROM CAST(logon_time AS TIMESTAMP)) >= 20) 
AND logon_time BETWEEN DATE '2016-05-01' AND SYSDATE 

Wird die out-of-Stunden-Anmeldungen erhalten von Mitternacht 1. Mai bis zur aktuellen Zeit.

+0

Fantastisch, danke MT0 – Huskie69