Lange Zeit Stalker, zum ersten Mal Poster (und SQL Anfänger). Meine Frage ist ähnlich wie diese SQL, um die verstrichene Zeit von mehreren zu finden überlappende Intervalle , außer dass ich CTE, UDFs usw. verwenden kann und nach weiteren Details suche.
Auf einem Stück Großgerät habe ich eine Aufzeichnung aller auftretenden Fehler. Fehler können auf verschiedenen Teilkomponenten des Systems auftreten, einige können sie komplett offline schalten (vollständiger Ausfall = ja), andere nicht (vollständiger Ausfall = nein). Fehler können sich zeitlich überschneiden und haben möglicherweise keine Endzeiten, wenn der Fehler noch nicht behoben wurde.
%Vor%Ich muss in der Lage sein, für einen benutzerdefinierten Zeitraum auszuarbeiten, wie lange das Gesamtsystem voll funktionstüchtig ist (keine Fehler), wie lange es abgebaut ist (ein oder mehrere nicht abgeschlossene Ausfälle) und wie lange nicht betriebsbereit ist (ein oder vollständigere Ausfälle). Ich muss auch in der Lage sein, für einen bestimmten Zeitraum herauszufinden, welche Fehler auf dem System waren. Ich dachte daran, eine "Stage Change" -Tabelle zu erstellen, wann immer eine Störung geöffnet oder geschlossen wird, aber ich bin auf dem besten Weg, dies zu tun - jede Hilfe zu dieser oder besseren Lösungen wäre willkommen!
Dies ist keine vollständige Lösung (ich überlasse das als Übung :)), sollte aber die grundlegende Technik veranschaulichen. Der Trick besteht darin, eine Zustandstabelle zu erstellen (wie Sie sagen). Wenn Sie eine 1 für ein "Start" -Ereignis und eine -1 für ein "Ende" -Ereignis aufzeichnen, gibt Ihnen eine laufende Summe in der Ereignis-Datum / Uhrzeit-Reihenfolge den aktuellen Status zu dem jeweiligen Ereignisdatum / -zeit. Das folgende SQL ist T-SQL, sollte aber leicht an den von Ihnen verwendeten Datenbankserver angepasst werden können.
Verwenden Sie Ihre Daten für einen Teilausfall als Beispiel:
%Vor%Wenn Sie SQL Server 2012 verwenden, haben Sie die Möglichkeit, die laufende Gesamtsumme mithilfe von Fensterfunktion .
Das Folgende ist eine grobe Anleitung, um das zu erreichen. Es wird mit einer Intervalltabelle von Daten und einer Intervalltabelle von 15 Minuten verglichen. Es summiert dann die Ausfallereignisse (1 Ereignis pro Intervall), aber summiert einen unvollständigen Ausfall nicht, wenn es einen vollständigen Ausfall gibt.
Sie könnten ein genaueres Zeitintervall verwenden, wenn Sie benötigen, wähle ich 15 Minuten für die Geschwindigkeit der Codierung.
Ich hatte bereits eine Datumsintervalltabelle "CAL.t_Calendar" eingerichtet, so dass Sie eine eigene erstellen müssen, um diesen Code auszuführen.
Bitte beachten Sie, dass dies nicht den tatsächlichen Code darstellt, den Sie verwenden sollten. Es ist nur als Demonstration gedacht und weist Sie in eine mögliche Richtung ...
BEARBEITEN Ich habe gerade festgestellt, dass ich die Null-Endtermine nicht berücksichtigt habe. Der Code muss geändert werden, um nach NULL endDates zu suchen und @EndDate oder GETDATE () zu verwenden, wenn @EndDate in der Zukunft liegt
%Vor%Tags und Links sql datetime overlapping