PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So finden Sie das Intervall zwischen zwei Daten in PostgreSQL

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