Problem:
Du vil gerne finde forskellen mellem to dato-/datotidsværdier i en PostgreSQL-database.
Eksempel:
Vores database har en tabel med navnet employment
med data i kolonnerne id
, first_name
, last_name
, start_date
og end_date
:
id | fornavn | efternavn | startdato | slutdato |
---|---|---|---|---|
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 |
Lad os for hver medarbejder få deres for- og efternavn og forskellen mellem start- og slutdatoen for deres ansættelse. Vi ønsker at se intervallet i år, måneder og dage.
Løsning 1:
Vi bruger AGE()
fungere. Her er den forespørgsel, du ville skrive:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Her er resultatet af forespørgslen:
fornavn | efternavn | employment_interval |
---|---|---|
Barbara | Wilson | 8 år 8 måneder 29 dage |
Robert | Anderson | 10 år 8 måneder 3 dage |
Steven | Nelson | 14 år 3 måneder 22 dage |
Diskussion:
Brug PostgreSQL AGE()
funktion til at hente intervallet mellem to tidsstempler eller datoer. Denne funktion tager to argumenter:det første er slutdatoen og det andet er startdatoen. I vores eksempel bruger vi kolonnen end_date
(dvs. når medarbejderen stoppede med at udføre dette job) og kolonnen start_date
(da medarbejderen startede det job).
Forskellen mellem datoer returneres som et interval i år, måneder, dage, timer osv. Forespørgslen til Steven Nelson returnerede ansættelsesperioden som intervallet '14 years 3 months 22 days
’; dette er forskellen mellem 2005-06-01, da han startede dette job, og 2019-09-23, hvor han stoppede det.
AGE()
funktion kan også vise forskellen mellem det aktuelle tidsstempel/dato og det første argument. I dette tilfælde har funktionen kun ét argument:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Forespørgslen ovenfor viser intervallet mellem det aktuelle tidsstempel (for denne tekst er det '2019-09-26') og hver medarbejders slutdato (kolonnen end_date
).
fornavn | efternavn | employment_interval |
---|---|---|
Barbara | Wilson | 10 måneder 27 dage |
Robert | Anderson | 7 år 9 måneder 6 dage |
Steven | Nelson | 3 dage |
Der er gået tre dage mellem Stevens sidste dag på jobbet og det aktuelle tidsstempel (i skrivende stund er det 2019-09-26).
Løsning 2:
Du kan også bruge minusoperatoren ( '-' ) i stedet for AGE()
for at trække to datoer fra.
Her er den forespørgsel, du ville skrive:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
I dette resultat vil du kun se forskellen i dage (ikke år, måneder og dage):
fornavn | efternavn | employment_interval |
---|---|---|
Barbara | Wilson | 3193 |
Robert | Anderson | 3899 |
Steven | Nelson | 5227 |