PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come trovare l'intervallo tra due date in PostgreSQL

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