Problem:
Du vill hitta skillnaden mellan två datum/datumtid-värden i en PostgreSQL-databas.
Exempel:
Vår databas har en tabell som heter employment
med data i kolumnerna id
, first_name
, last_name
, start_date
och end_date
:
id | förnamn | efternamn | startdatum | slutdatum |
---|---|---|---|---|
1 | Barbara | Wilson | 2010-02-01 | 2018-10-30 |
2 | Robert | Anderson | 2001-04-17 | 2011-12-20 |
3 | Steven | Nelson | 2005-06-01 | 2019-09-23 |
Låt oss för varje anställd få deras för- och efternamn och skillnaden mellan start- och slutdatum för deras anställning. Vi vill se intervallet i år, månader och dagar.
Lösning 1:
Vi använder AGE()
fungera. Här är frågan du skulle skriva:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Här är resultatet av frågan:
förnamn | efternamn | anställningsintervall |
---|---|---|
Barbara | Wilson | 8 år 8 månader 29 dagar |
Robert | Anderson | 10 år 8 månader 3 dagar |
Steven | Nelson | 14 år 3 månader 22 dagar |
Diskussion:
Använd PostgreSQL AGE()
funktion för att hämta intervallet mellan två tidsstämplar eller datum. Den här funktionen tar två argument:det första är slutdatumet och det andra är startdatumet. I vårt exempel använder vi kolumnen end_date
(dvs när den anställde slutade göra det jobbet) och kolumnen start_date
(när den anställde började det jobbet).
Skillnaden mellan datum returneras som ett intervall i år, månader, dagar, timmar, etc. Frågan för Steven Nelson returnerade anställningstiden som intervallet "14 years 3 months 22 days
’; det här är skillnaden mellan 2005-06-01, när han började det här jobbet, och 2019-09-23, när han slutade det.
AGE()
funktionen kan också visa skillnaden mellan aktuell tidsstämpel/datum och det första argumentet. I det här fallet har funktionen bara ett argument:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Frågan ovan visar intervallet mellan den aktuella tidsstämpeln (för den här texten är det '2019-09-26') och varje anställds slutdatum (kolumnen end_date
).
förnamn | efternamn | anställningsintervall |
---|---|---|
Barbara | Wilson | 10 månader 27 dagar |
Robert | Anderson | 7 år 9 månader 6 dagar |
Steven | Nelson | 3 dagar |
Tre dagar har förflutit mellan Stevens sista dag på jobbet och den aktuella tidsstämpeln (i skrivande stund är det 2019-09-26).
Lösning 2:
Du kan också använda minusoperatorn ( '-' ) istället för AGE()
för att subtrahera två datum.
Här är frågan du skulle skriva:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
I det här resultatet ser du bara skillnaden i dagar (inte år, månader och dagar):
förnamn | efternamn | anställningsintervall |
---|---|---|
Barbara | Wilson | 3193 |
Robert | Anderson | 3899 |
Steven | Nelson | 5227 |