Loopo
Admiral
- Registriert
- Juli 2002
- Beiträge
- 7.617
Ich habe Daten in einer Postgres-DB, die angeben, wann ein Dienst am Server XY down war und wann er wieder zur Verfügung stand. Einfachhalber sieht die DB so aus:
outage.serviceid (integer)
outage.serverid (integer)
outage.downtime (datetime)
outage.uptime (datetime)
Ich will nun die Verfügbarkeiten mittels einer SQL-Abfrage oder Stored Procedure ermitteln. Die Herausforderung ist, dass ich zwei verschiede Verfügbarkeiten benötige: eine unbetreute von 19 Uhr bis 7 Uhr und die betreute von 7 Uhr bis 19 Uhr.
Jetzt gibt es natürlich das Problem der Überschneidung:
Ich habe mir überlegt, dass man die Ausfallzeiten zuerst für jeden Tag zerschnippselt hinterlegt und diese dann in einem zweiten Schritt aufsummiert für jeden Tag: Also ein Service ist von 22 Uhr bis 17 Uhr ausgefallen, das heißt am ersten Tag werden 2 Stunden Ausfallzeit unbetreut gespeichert. Am zweiten Tag werden 7 Stunden Ausfallzeit unbetreut und 10 Stunden Ausfallzeit betreut gespeichert.
Vielleicht weiß ja jemand eine einfachere Lösung oder hat so ein Problem schon mal gelöst.
Eine SQL-Abfrage fürs zerschnippseln nach Tag könnte ja irgendwie so aussehen:
Leicht abgeändert müsste man dies zwei mal für unbetreut und betreut machen. Wie würde zumindest obige (Postgre-)SQL-Abfrage korrekt aussehen?
outage.serviceid (integer)
outage.serverid (integer)
outage.downtime (datetime)
outage.uptime (datetime)
Ich will nun die Verfügbarkeiten mittels einer SQL-Abfrage oder Stored Procedure ermitteln. Die Herausforderung ist, dass ich zwei verschiede Verfügbarkeiten benötige: eine unbetreute von 19 Uhr bis 7 Uhr und die betreute von 7 Uhr bis 19 Uhr.
Jetzt gibt es natürlich das Problem der Überschneidung:
- ein Service kann in der unbetreuten Zeit ausfallen und in der betreuten Zeit wieder on gehen bzw. umgekehrt
- ein Service kann in der unbetreuten Zeit ausfallen und nach einer betreuten Zeit wieder on gehen bzw. umgekehrt
- ein Service kann über mehr als einen Tag ausfallen
- ein Service kann bis zur aktuellen Zeit down sein (hier könnte man annehmen, dass die Uptime NOW() ist)
Ich habe mir überlegt, dass man die Ausfallzeiten zuerst für jeden Tag zerschnippselt hinterlegt und diese dann in einem zweiten Schritt aufsummiert für jeden Tag: Also ein Service ist von 22 Uhr bis 17 Uhr ausgefallen, das heißt am ersten Tag werden 2 Stunden Ausfallzeit unbetreut gespeichert. Am zweiten Tag werden 7 Stunden Ausfallzeit unbetreut und 10 Stunden Ausfallzeit betreut gespeichert.
Vielleicht weiß ja jemand eine einfachere Lösung oder hat so ein Problem schon mal gelöst.
Eine SQL-Abfrage fürs zerschnippseln nach Tag könnte ja irgendwie so aussehen:
Code:
SELECT
outage.serviceid,
outage.serverid,
MIN (Datum_23:59:59_Uhr from day_of_interest, outage.uptime) - # Minus-Operator, falls uptime gleich Null uptime ist NOW() bzw. Ende des Tages
MAX (Datum_0:00:00_Uhr from day_of_interest, outage.downtime),
FROM
outage
WHERE
outage.downtime <= Datum_23:59_Uhr
AND
outage.uptime >= Datum_0:00_Uhr
Leicht abgeändert müsste man dies zwei mal für unbetreut und betreut machen. Wie würde zumindest obige (Postgre-)SQL-Abfrage korrekt aussehen?
Zuletzt bearbeitet: