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 |