sql >> Database >  >> RDS >> PostgreSQL

Hoe het interval tussen twee datums in PostgreSQL te vinden

Probleem:

U wilt het verschil vinden tussen twee datum/datum/tijd-waarden in een PostgreSQL-database.

Voorbeeld:

Onze database heeft een tabel met de naam employment met gegevens in de kolommen id , first_name , last_name , start_date , en end_date :

id voornaam achternaam startdatum einddatum
1 Barbara Wilson 01-02-01 30-10-2018
2 Robert Anderson 2001-04-17 2011-12-20
3 Steven Nelson 2005-06-01 23-09-2019

Laten we voor elke werknemer hun voor- en achternaam krijgen en het verschil tussen de begin- en einddatum van hun dienstverband. We willen het interval in jaren, maanden en dagen zien.

Oplossing 1:

We gebruiken de AGE() functie. Dit is de vraag die je zou schrijven:

SELECT first_name, 
             last_name, 
             AGE(end_date, start_date) 
         AS  employment_interval 
FROM employment;

Dit is het resultaat van de zoekopdracht:

voornaam achternaam employment_interval
Barbara Wilson 8 jaar 8 maanden 29 dagen
Robert Anderson 10 jaar 8 maanden 3 dagen
Steven Nelson 14 jaar 3 maanden 22 dagen

Discussie:

Gebruik de PostgreSQL AGE() functie om het interval tussen twee tijdstempels of datums op te halen. Deze functie heeft twee argumenten:de eerste is de einddatum en de tweede is de startdatum. In ons voorbeeld gebruiken we de kolom end_date (d.w.z. toen de werknemer stopte met dat werk) en de kolom start_date (wanneer de werknemer met die baan begon).

Het verschil tussen datums wordt geretourneerd als een interval in jaren, maanden, dagen, uren, enz. De zoekopdracht voor Steven Nelson de periode van dienstverband geretourneerd als het interval '14 years 3 months 22 days ’; dit is het verschil tussen 01-06-2005, toen hij met deze baan begon, en 2019-09-23, toen hij ermee stopte.

De AGE() functie kan ook het verschil weergeven tussen de huidige tijdstempel/datum en het eerste argument. In dit geval heeft de functie maar één argument:

SELECT first_name,
             last_name,
             AGE(end_date)
         AS  employment_interval
FROM employment;

De bovenstaande query geeft het interval weer tussen de huidige tijdstempel (voor deze tekst is dit '2019-09-26') en de einddatum van elke werknemer (de kolom end_date ).

voornaam achternaam employment_interval
Barbara Wilson 10 maanden 27 dagen
Robert Anderson 7 jaar 9 maanden 6 dagen
Steven Nelson 3 dagen

Er zijn drie dagen verstreken tussen Stevens laatste werkdag en de huidige tijdstempel (op het moment van schrijven is dat 26-09-2019).

Oplossing 2:

U kunt ook de min-operator ( '-' ) gebruiken in plaats van AGE() om twee datums af te trekken.

Dit is de vraag die je zou schrijven:

SELECT first_name,
             last_name,
             end_date::DATE – start_date::DATE 
         AS  employment_interval 
FROM employment;

In dit resultaat zie je alleen het verschil in dagen (geen jaren, maanden en dagen):

voornaam achternaam employment_interval
Barbara Wilson 3193
Robert Anderson 3899
Steven Nelson 5227

  1. Booleaans veld in Oracle

  2. 3 manieren om het aantal rijen in elke partitie in SQL Server (T-SQL) te retourneren

  3. EF en TransactionScope voor zowel SQL Server als Oracle zonder te escaleren/overspannen naar DTC?

  4. Een variabele doorgeven aan een trigger