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 |