Arbeiten mit Zeitintervallen: INTERVAL
Das Training dauert anderthalb Stunden, ein Arbeitstag — 8 Stunden, die Pause — 20 Minuten und Eier kochen braucht 10 Minuten. All das sind Zeitintervalle.
Zeitintervalle sind in echten Anwendungen super praktisch, zum Beispiel wenn du Deadlines berechnen, die Differenz zwischen zwei Daten rausfinden oder Zeit addieren/abziehen willst. Aber bevor wir tiefer einsteigen, lass uns kurz wiederholen, wo wir in den letzten Vorlesungen aufgehört haben.
In PostgreSQL ist INTERVAL ein spezieller Datentyp, der für Zeitspannen gedacht ist. Im Gegensatz zu anderen Zeittypen speichert er kein konkretes Datum oder eine Uhrzeit, sondern beschreibt eine Periode, zum Beispiel: "2 Tage", "3 Stunden", "5 Minuten".
INTERVAL Syntax
Intervalle kannst du so angeben:
INTERVAL 'zahl zeiteinheit'
Beispiele:
INTERVAL '2 days' -- Zwei Tage
INTERVAL '3 hours' -- Drei Stunden
INTERVAL '15 minutes' -- Fünfzehn Minuten
INTERVAL '1 day 2 hours' -- Ein Tag und zwei Stunden
PostgreSQL unterstützt verschiedene Zeiteinheiten: year, month, day, hour, minute, second. Du kannst die auch in einem Ausdruck kombinieren.
Intervalle in Abfragen verwenden
Der Datentyp INTERVAL wird richtig nützlich, wenn du ihn mit anderen Zeittypen (DATE, TIMESTAMP) kombinierst. Schauen wir uns die wichtigsten Operationen an.
Intervall zu Datum/Uhrzeit addieren
Du kannst Intervalle zu Datums- oder Zeitwerten addieren. Zum Beispiel:
SELECT CURRENT_DATE + INTERVAL '7 days' AS lieferdatum;
-- Wir bekommen das Datum in 7 Tagen ab heute
Ergebnis:
| lieferdatum |
|---|
| 2023-10-08 |
Intervalle von Datum/Uhrzeit abziehen
Du kannst Intervalle nicht nur addieren, sondern auch abziehen:
SELECT NOW() - INTERVAL '2 hours' AS vor_zwei_stunden;
-- Wir bekommen die Uhrzeit vor zwei Stunden
Ergebnis:
| vor_zwei_stunden |
|---|
| 2023-10-01 10:00:00.000 |
Differenz zwischen zwei Daten berechnen
Einer der coolsten Features von INTERVAL ist das Berechnen der Differenz zwischen zwei Daten:
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS tage_differenz;
-- Wie viele Tage liegen zwischen zwei Daten
Ergebnis:
| tage_differenz |
|---|
| 14 days |
Beachte, dass das Ergebnis hier auch als Zeitintervall dargestellt wird.
Praktische Beispiele mit INTERVAL
Lieferdatum berechnen. Stell dir einen Online-Shop vor, wo die Lieferung zwischen 3 und 7 Tagen dauert. So kannst du die möglichen Lieferdaten berechnen:
SELECT CURRENT_DATE + INTERVAL '3 days' AS früheste_lieferung,
CURRENT_DATE + INTERVAL '7 days' AS späteste_lieferung;
Ergebnis:
| früheste_lieferung | späteste_lieferung |
|---|---|
| 2023-10-04 | 2023-10-08 |
Aufgabenlaufzeit berücksichtigen. Angenommen, es gibt eine Tabelle tasks, in der jede Aufgabe ein Startdatum hat. Du willst das Enddatum der Aufgabe berechnen, je nachdem wie lange sie dauert (in Stunden):
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('Bericht vorbereiten', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('Anwendung testen', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
Ergebnis:
| task_name | start_time | end_time |
|---|---|---|
| Bericht vorbereiten | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| Anwendung testen | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
Vergleich der Laufzeiten. Manchmal willst du alle Aufgaben finden, die weniger als 3 Stunden gedauert haben:
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
Ergebnis:
| task_name |
|---|
| Anwendung testen |
Nützliche Tricks mit Intervallen
Dynamische Intervallberechnung. Du kannst Intervalle mit anderen Operationen kombinieren. Zum Beispiel kannst du die Anzahl der Tage aus einer Spalte nehmen und sie in ein Intervall umwandeln:
SELECT CURRENT_DATE + (bestell_tage || ' days')::INTERVAL AS bestell_fälligkeitsdatum
FROM bestellungen;
Intervalle in Strings umwandeln. Manchmal willst du ein Intervall als String anzeigen:
SELECT INTERVAL '2 days 3 hours'::TEXT AS intervall_text;
Ergebnis:
| intervall_text |
|---|
| 2 days 03:00:00 |
Häufige Fehler bei INTERVAL
Mit INTERVAL zu arbeiten ist zwar mächtig, aber manchmal tricky. Ein typischer Fehler ist das falsche Format. Zum Beispiel, wenn du INTERVAL '2 hours and 30 minutes' schreibst, bekommst du einen Fehler, weil PostgreSQL das "and" nicht versteht. Richtig ist: INTERVAL '2 hours 30 minutes'.
Ein weiterer Fehler ist, die Zeiteinheit zu vergessen, wie bei INTERVAL '2'. PostgreSQL weiß dann nicht, was das für eine "2" ist, also gib immer die Einheit an (2 days, 2 hours).
GO TO FULL VERSION