Problema:
Ti piacerebbe trovare la differenza tra due valori di data/ora in un database PostgreSQL.
Esempio:
Il nostro database ha una tabella denominata employment
con i dati nelle colonne id
, first_name
, last_name
, start_date
e end_date
:
id | nome | cognome | data_inizio | data_fine |
---|---|---|---|---|
1 | Barbara | Wilson | 01-02-2010 | 30-10-2018 |
2 | Roberto | Anderson | 17-04-2001 | 20-12-2011 |
3 | Steven | Nelson | 01-06-2005 | 23-09-2019 |
Per ogni dipendente, prendiamo nome e cognome e la differenza tra la data di inizio e di fine del suo impiego. Vogliamo vedere l'intervallo in anni, mesi e giorni.
Soluzione 1:
Useremo il AGE()
funzione. Ecco la domanda che scriveresti:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Ecco il risultato della query:
first_name | cognome | intervallo_di_occupazione |
---|---|---|
Barbara | Wilson | 8 anni 8 mesi 29 giorni |
Roberto | Anderson | 10 anni 8 mesi 3 giorni |
Steven | Nelson | 14 anni 3 mesi 22 giorni |
Discussione:
Usa il AGE()
di PostgreSQL funzione per recuperare l'intervallo tra due timestamp o date. Questa funzione accetta due argomenti:il primo è la data di fine e il secondo è la data di inizio. Nel nostro esempio, utilizziamo la colonna end_date
(ovvero quando il dipendente ha smesso di svolgere quel lavoro) e la colonna start_date
(quando il dipendente ha iniziato quel lavoro).
La differenza tra le date viene restituita come intervallo in anni, mesi, giorni, ore, ecc. La query per Steven Nelson ha restituito il periodo di lavoro come intervallo "14 years 3 months 22 days
'; questa è la differenza tra il 01-06-2005, quando ha iniziato questo lavoro, e il 23-09-2019, quando lo ha interrotto.
Il AGE()
La funzione può anche visualizzare la differenza tra il timestamp/data corrente e il primo argomento. In questo caso, la funzione ha un solo argomento:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
La query sopra mostra l'intervallo tra il timestamp corrente (per questo testo è "26-09-2019") e la data di fine di ciascun dipendente (la colonna end_date
).
first_name | cognome | intervallo_di_occupazione |
---|---|---|
Barbara | Wilson | 10 mesi 27 giorni |
Roberto | Anderson | 7 anni 9 mesi 6 giorni |
Steven | Nelson | 3 giorni |
Sono trascorsi tre giorni tra l'ultimo giorno di lavoro di Steven e il timestamp corrente (al momento in cui scrivo, è il 26-09-2019).
Soluzione 2:
Puoi anche usare l'operatore meno ( '-' ) invece di AGE()
per sottrarre due date.
Ecco la domanda che scriveresti:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
In questo risultato, vedrai solo la differenza in giorni (non anni, mesi e giorni):
first_name | cognome | intervallo_di_occupazione |
---|---|---|
Barbara | Wilson | 3193 |
Roberto | Anderson | 3899 |
Steven | Nelson | 5227 |