Problem:
Sie möchten den Unterschied zwischen zwei date/datetime-Werten in einer PostgreSQL-Datenbank finden.
Beispiel:
Unsere Datenbank hat eine Tabelle namens employment
mit Daten in den Spalten id
, first_name
, last_name
, start_date
und end_date
:
id | Vorname | Nachname | Startdatum | Enddatum |
---|---|---|---|---|
1 | Barbara | Wilson | 2010-02-01 | 2018-10-30 |
2 | Robert | Anderson | 2001-04-17 | 20.12.2011 |
3 | Steven | Nelson | 01.06.2005 | 2019-09-23 |
Lassen Sie uns für jeden Mitarbeiter seinen Vor- und Nachnamen und die Differenz zwischen dem Anfangs- und Enddatum seiner Beschäftigung erhalten. Wir möchten das Intervall in Jahren, Monaten und Tagen sehen.
Lösung 1:
Wir verwenden das AGE()
Funktion. Hier ist die Abfrage, die Sie schreiben würden:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Hier ist das Ergebnis der Abfrage:
Vorname | Nachname | beschäftigungsintervall |
---|---|---|
Barbara | Wilson | 8 Jahre 8 Monate 29 Tage |
Robert | Anderson | 10 Jahre 8 Monate 3 Tage |
Steven | Nelson | 14 Jahre 3 Monate 22 Tage |
Diskussion:
Verwenden Sie das PostgreSQL-AGE()
Funktion zum Abrufen des Intervalls zwischen zwei Zeitstempeln oder Datumsangaben. Diese Funktion akzeptiert zwei Argumente:Das erste ist das Enddatum und das zweite das Startdatum. In unserem Beispiel verwenden wir die Spalte end_date
(d. h. wann der Mitarbeiter mit dieser Tätigkeit aufgehört hat) und die Spalte start_date
(wenn der Mitarbeiter diesen Job angetreten hat).
Die Differenz zwischen Daten wird als Intervall in Jahren, Monaten, Tagen, Stunden usw. zurückgegeben. Die Abfrage für Steven Nelson gab die Beschäftigungsdauer als Intervall „14 years 3 months 22 days
zurück ’; das ist der Unterschied zwischen dem 01.06.2005, als er diesen Job anfing, und dem 23.09.2019, als er damit aufhörte.
Das AGE()
Die Funktion kann auch den Unterschied zwischen dem aktuellen Zeitstempel/Datum und dem ersten Argument anzeigen. In diesem Fall hat die Funktion nur ein Argument:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Die obige Abfrage zeigt das Intervall zwischen dem aktuellen Zeitstempel (für diesen Text ist es „2019-09-26“) und dem Enddatum jedes Mitarbeiters (die Spalte end_date
). ).
Vorname | Nachname | beschäftigungsintervall |
---|---|---|
Barbara | Wilson | 10 Monate 27 Tage |
Robert | Anderson | 7 Jahre 9 Monate 6 Tage |
Steven | Nelson | 3 Tage |
Zwischen Stevens letztem Arbeitstag und dem aktuellen Zeitstempel (zum Zeitpunkt des Schreibens ist das der 26.09.2019) sind drei Tage vergangen.
Lösung 2:
Anstelle von AGE()
können Sie auch den Minusoperator (‘-‘) verwenden um zwei Daten zu subtrahieren.
Hier ist die Abfrage, die Sie schreiben würden:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
In diesem Ergebnis sehen Sie nur den Unterschied in Tagen (nicht in Jahren, Monaten und Tagen):
Vorname | Nachname | beschäftigungsintervall |
---|---|---|
Barbara | Wilson | 3193 |
Robert | Anderson | 3899 |
Steven | Nelson | 5227 |