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 |