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

Come funziona age() in PostgreSQL

In Postgres, age() la funzione restituisce l'età in base a due variabili timestamp o data.

Il risultato viene restituito utilizzando anni e mesi, anziché solo giorni.

Ad esempio, un risultato potrebbe essere simile al seguente:3 anni 2 mesi 30 giorni .

Sintassi

Puoi utilizzare una delle due seguenti sintassi:

age(timestamp)
age(timestamp, timestamp)

Il primo restituisce l'età in base alla data corrente. In particolare, sottrae da current_date() (a mezzanotte).

La seconda sintassi consente di ottenere la data in base a due date esplicite. L'uso di questa sintassi fa sì che la seconda data venga sottratta dalla prima. In altre parole, l'età non si basa sulla data odierna, ma sulla data fornita nel primo argomento.

Esempio 1:utilizzare la data odierna

Ecco un esempio per dimostrare la prima sintassi.

SELECT 	age(timestamp '1987-03-14');

Risultato:

33 years 2 mons 30 days

In questo caso, ho fornito un unico argomento. Il age() la funzione ha quindi sottratto quello dalla data odierna (la data in cui ho eseguito la query) e otteniamo il risultato.

Solo per dimostrarlo ulteriormente, eccolo di nuovo, ma questa volta insieme a current_date() per mostrare la data in cui ho eseguito la query.

SELECT 	
  current_date,
  age(timestamp '1987-03-14');

Risultato:

 current_date |           age           
--------------+-------------------------
 2020-06-13   | 33 years 2 mons 30 days

Esempio 2:utilizzare una data personalizzata

In questo esempio, fornisco due date con cui confrontare. Pertanto, l'età non è basata sulla data odierna. Si basa sulla prima data fornita a age() funzione.

SELECT age(timestamp '2001-01-01', timestamp '2000-03-14');

Risultato:

9 mons 18 days

In questo caso, l'età è inferiore a un anno e quindi l'anno non è menzionato nei risultati.

Ecco un altro esempio che mostra cosa succede se cambia solo l'anno (cioè le porzioni di mese e giorno delle due date sono esattamente le stesse, ma l'anno è diverso).

SELECT age(timestamp '2007-01-01', timestamp '2000-01-01');

Risultato:

7 years

Quindi, ancora una volta, omette semplicemente le parti che non sono rilevanti (in questo caso i mesi e i giorni).

Esempio 3 – Date identiche

Ecco cosa succede se entrambe le date sono uguali.

SELECT age(timestamp '2001-01-01', timestamp '2001-01-01');

Risultato:

00:00:00

Esempio 4 – Età negativa

Se la seconda data è successiva alla prima data, ti ritroverai con un'età negativa.

SELECT age(timestamp '2001-01-01', timestamp '2002-03-07');

Risultato:

-1 years -2 mons -6 days

Qui il segno meno è anteposto a tutti i componenti della data (cioè i componenti anno, mese e giorni).

Esempio 5 – Età in anni

Se vuoi solo l'età in anni, puoi usare uno dei due extract() o date_part() per estrarre l'anno da age() valore di ritorno della funzione.

Ecco un esempio che utilizza extract() funzione:

SELECT extract(year from age(timestamp '1997-10-25'));

Risultato:

22.0

Ecco come appare quando lo eseguo in Azure Data Studio.

Quando lo eseguo in psql , ho questo:

22

Entrambi extract() e date_part() restituiscono i risultati utilizzando il tipo di dati a doppia precisione.

Puoi convertirlo in un numero intero (o in un altro tipo di dati), se necessario, aggiungendolo con ::int .

SELECT extract(year from age(timestamp '1997-10-25'))::int;

Risultato:

22