HOWTO · PostgreSQL

Alternativen zu DATEADD() in PostgreSQL

Dieser Artikel beschreibt Alternativen zu DATEADD() in PostgreSQL.

Auf dieser Seite

PostgreSQL verwendet nicht die DATEADD()-Syntax von SQL Server. Für eine ganze Anzahl von Tagen addieren Sie die entsprechende Ganzzahl zu einem date, zum Beispiel mit manufacture_date + expires_in. Für Kalendereinheiten wie Monate oder Jahre verwenden Sie ein INTERVAL, etwa date '2022-08-24' + INTERVAL '2 months'. Der erste Ausdruck liefert ein date; wird ein Intervall zu einem Datum addiert, ergibt sich ein Zeitstempel ohne Zeitzone.

Die DATEADD()-Funktion in SQL

Eine Produkttabelle kann ein Herstellungsdatum und eine ganzzahlige Anzahl von Tagen bis zum Ablauf enthalten. Eine Zeile könnte beispielsweise manufacture_date = DATE '2022-08-24' und expires_in = 10 enthalten. Aus diesen beiden Werten soll das Ablaufdatum berechnet werden.

DATEADD() ist die SQL-Server-Funktion, die häufig für diese Aufgabe verwendet wird. In SQL Server lautet der Ausdruck DATEADD(day, 10, '2022-08-24'): Das erste Argument bezeichnet einen Datumsteil, das zweite gibt die Anzahl an und das dritte ist das Ausgangsdatum. Diese Syntax dient als Vergleich für Leser, die von SQL Server kommen; sie ist keine PostgreSQL-Abfrage. In PostgreSQL wird Datumsarithmetik stattdessen mit Operatoren und Intervallen ausgedrückt.

Der Unterschied ist wichtig, denn „Tage addieren“ und „einen Kalendermonat addieren“ sind verschiedene Vorgänge. Eine Tagesanzahl entspricht einer festen Anzahl von Kalendertagen. Ein Monat hat hingegen eine variable Anzahl von Tagen. Wird ein Monat in eine feste Tagesanzahl umgerechnet, kann daher ein falsches Kalenderdatum herauskommen. Wählen Sie die PostgreSQL-Form, die zur gewünschten Einheit passt.

Die Operatoren + und - als Alternative zu DATEADD() in PostgreSQL verwenden

Für Tagesverschiebungen können Sie in PostgreSQL eine Ganzzahl direkt zu einem date addieren. Der Ausdruck DATE '2022-08-24' + 10 berechnet das Datum zehn Tage später. Tage ziehen Sie mit DATE '2022-09-03' - 10 ab oder addieren eine negative Ganzzahl, zum Beispiel mit DATE '2022-09-03' + (-10). Das sind Datumsausdrücke: Das Ergebnis bleibt ein date, eine Uhrzeit kommt nicht hinzu.

Diese kompakte Schreibweise eignet sich, wenn die Verschiebung in Tagen angegeben ist, auch wenn sie aus einer ganzzahligen Spalte wie expires_in stammt. Beispielsweise berechnet manufacture_date + expires_in für jede Produktzeile ein Ablaufdatum. Achten Sie darauf, dass der gespeicherte Wert Tage bezeichnet: Eine zu einem Datum addierte Ganzzahl steht nicht für Monate oder Jahre. Ist der Betrag ein Parameter, sollte sein Typ zur Ganzzahlarithmetik passen; falls erforderlich, können Sie ihn in einen Integer umwandeln.

Das folgende Python-Beispiel verwendet dasselbe Herstellungsdatum und dieselbe gespeicherte Tagesanzahl, um das Ablaufdatum zu berechnen:

from datetime import date, timedelta

manufacture_date = date(2022, 8, 24)
expires_in = 10
expiration_date = manufacture_date + timedelta(days=expires_in)
print(expiration_date.isoformat())
2022-09-03

Dieses Python-Beispiel veranschaulicht die Datumsberechnung; es führt kein PostgreSQL-SQL aus. Verwenden Sie in einer PostgreSQL-Abfrage den oben gezeigten Datumsausdruck.

Verwenden Sie ein Intervall, wenn die Berechnung Kalendermonate, Jahre, Wochen oder eine Kombination aus Einheiten umfasst. So bleibt die vorgesehene Einheit im Ausdruck sichtbar, und es wird nicht so getan, als hätte jeder Monat eine feste Anzahl von Tagen.

Den Datentyp INTERVAL als Alternative zu DATEADD() in PostgreSQL verwenden

Ein INTERVAL bezeichnet eine Zeitspanne. Für kalenderbezogene Berechnungen addieren Sie ein solches Intervall zu einem Datum: DATE '2022-08-24' + INTERVAL '10 days', DATE '2022-08-24' + INTERVAL '2 months' oder DATE '2022-08-24' + INTERVAL '1 year'. Auch Wochen sind zulässig, etwa mit DATE '2022-08-24' + INTERVAL '1 week'. In Intervallliteralen erlaubt PostgreSQL sowohl Einzahl- als auch Mehrzahlformen der Einheiten.

Ein Intervall kann mehrere Einheiten kombinieren, zum Beispiel INTERVAL '1 week 2 days'. Das ist nützlich, wenn sich eine Verschiebung aus mehreren Kalenderbestandteilen zusammensetzt. Ein Intervall kann außerdem Stunden, Minuten und Sekunden enthalten. Wird ein Intervall zu einem date addiert, liefert PostgreSQL einen Zeitstempel ohne Zeitzone. Der angezeigte Wert enthält dann eine Uhrzeit, normalerweise Mitternacht. Wenn die Anwendung anschließend ein Datum benötigt, wandeln Sie das Ergebnis ausdrücklich in date um.

Kalendereinheiten folgen der Kalenderarithmetik und werden nicht in eine feste Anzahl von Tagen umgerechnet. Wird zu einem Datum gegen Ende eines langen Monats ein Monat addiert, kann das Ergebnis auf den letzten gültigen Tag des Folgemonats fallen. Es kann sich daher von dem Ergebnis unterscheiden, das beim Addieren einer festen Tagesanzahl entsteht. Prüfen Sie den Ausdruck mit für Ihre Daten repräsentativen Datumswerten und wählen Sie Monate oder Tage entsprechend der fachlichen Regel.

Für das Produktbeispiel multiplizieren Sie die gespeicherte Tagesanzahl mit einem Intervall von einem Tag: manufacture_date + expires_in * INTERVAL '1 day'. So lässt sich die Berechnung für jede Zeile durchführen. Da der Ausdruck ein Intervall verwendet, ist das Ergebnis ein Zeitstempel. Benötigen Sie ein Datum als Ergebnis, verwenden Sie (manufacture_date + expires_in * INTERVAL '1 day')::date. Für eine gespeicherte Monatsanzahl funktioniert dasselbe Muster mit INTERVAL '1 month'; wählen Sie eine Intervalleinheit, die der Bedeutung der Spalte entspricht.

Die PostgreSQL-Beispiele in diesem Artikel sind SQL-Ausdrücke, aber die konfigurierte Laufzeitumgebung des Artikels führt keine PostgreSQL-Anweisungen aus. Betrachten Sie sie als nicht ausgeführte SQL-Beispiele und führen Sie sie in Ihrer PostgreSQL-Datenbank aus. DATEADD() wird nur zum Vergleich mit dem SQL-Server-Äquivalent erwähnt; verwenden Sie in PostgreSQL-Abfragen die Formen mit +, - und INTERVAL.