Datenbanktheorie » Zeitintervalle mit SQL

--> zurück zur Übersicht "Datenbanktheorie"

Zeitintervalle mit SQL verarbeiten

von Holger Maaß, 08.12.2012, Update am 29.04.2014

Die folgenden Code-Beispiele sollen zeigen, welche Möglichkeiten man hat, mit SQL solche Daten zu bearbeiten, die Zeitintervalle enthalten. Dabei kommt die selten genutzte, aber sehr mächtige Technik des Theta-Join zum Einsatz, bei dem in der Verknüpfungsbedingung Ungleichheit abgefragt wird.

Für die im Beispiel bearbeitete Aufgabe sind Daten gegeben, wo pro Fallnummer mehrere Zeitintervalle gelistet sind, die sich gegenseitig beliebig überschneiden können. Solche Daten können z.B. auf der Intensivstation im Krankenhaus entstehen, wenn die Zeiten festgehalten werden, in denen ein Patient künstlich beatmet wird. Die Aufgabe ist, pro Fallnummer und Tag die Beatmungszeit in Minuten anzugeben, wobei sich überschneidende Zeiträume nur einmal gezählt werden dürfen.

Es sind hier drei verschiedene Lösungsansätze in SQL lauffähig ausprogrammiert und zwar sowohl in einer Version für SQL Server (ab 2005) als auch für MySQL (ab 5.0). Die Versionen für Oracle (getestet mit 11g) und SQLite (getestet mit SQLite 3) sind am 29.04.2014 hinzugekommen. Für alle drei Lösungsansätze können die gleichen Testdaten verwendet werden.

SQL Server

MySQL

Oracle

SQLite

Tabelle für Testdaten erstellen

Tabelle für Testdaten erstellen

Tabelle für Testdaten erstellen

Tabelle für Testdaten erstellen

Testdaten einfügen

Testdaten einfügen

Testdaten einfügen

Testdaten einfügen

1. Lösung:

Man zerlegt die einzelnen Zeitintervalle zu einer Fallnummer in Teilintervalle, so dass sich keine Teilintervalle mehr überschneiden und alle Zeitintervalle aus den Teilintervallen zusammengesetzt werden können. Die Idee ist hier, die Intervalle in (eine Art) relative Atome zu zerlegen, die so klein sind wie nötig, aber nicht kleiner als nötig. Die Lösung ist m.E. die beste der drei vorgeschlagenen, da man ihre Grundidee leicht auf analoge Aufgabenstellungen übertragen kann und sie außerdem sehr performant ist.

SQL Server

MySQL

Oracle

SQLite

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten

 

2. Lösung:

Im zweiten Lösungsansatz werden mehrere Einzelintervalle einer Fallnummer zu einem zusammenhängenden Intervall zusammengefasst, wenn zwischen ihnen keine Lücken bestehen, wenn sie also direkt aneinander anschließen oder sich überschneiden. Zu einer Fallnummer kann es mehrere solche zusammengefassten Intervalle geben, zwischen denen dann Lücken bestehen. Diese Lösung ist auch sehr performant, und die Grundidee lässt sich auch auf einige andere Aufgabenstellungen übertragen. Ihre Einsatzmöglichkeiten sind m.E. aber nicht so breit wie bei Lösung 1.

SQL Server

MySQL

Oracle

SQLite

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten

 

3. Lösung:

Der dritte Lösungsansatz hat gegenüber den ersten beiden ganz entscheidende Nachteile, denn er ist nicht performant genug und daher bei größeren Datenmengen gar nicht mehr einsetzbar. Er beruht auf der Idee, die Zeitintervalle in einzelne Minuten zu zerlegen. Wie in Lösung 1 werden hier also auch Teilintervalle gebildet, aber sie sind viel kleiner als nötig und erzeugen daher zu große Zwischendatenmengen bei der Ausführung. Während in Lösung 1 die Zeitintervalle in relative Atome zerlegt werden, sind es hier absolute Atome (Minuten).

SQL Server

MySQL

Oracle

SQLite

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Tabellen erstellen

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten

Daten aufbereiten