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

Sådan fungerer age() i PostgreSQL

I Postgres er age() funktion returnerer alderen baseret på to tidsstempel eller datovariable.

Resultatet returneres efter år og måneder i stedet for kun dage.

For eksempel kan et resultat se sådan ud:3 år 2 måneder 30 dage .

Syntaks

Du kan bruge en af ​​følgende to syntakser:

age(timestamp)
age(timestamp, timestamp)

Den første returnerer alderen baseret på den aktuelle dato. Specifikt trækker den fra current_date() (ved midnat).

Den anden syntaks giver dig mulighed for at få datoen baseret på to eksplicitte datoer. Brug af denne syntaks får den anden dato til at blive trukket fra den første. Med andre ord er alderen ikke baseret på dagens dato – den er baseret på datoen angivet i det første argument.

Eksempel 1 – Brug dagens dato

Her er et eksempel til at demonstrere den første syntaks.

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

Resultat:

33 years 2 mons 30 days

I dette tilfælde gav jeg et enkelt argument. age() funktion trækker det så fra dagens dato (datoen jeg kørte forespørgslen), og vi får resultatet.

Bare for at demonstrere dette yderligere, her er det igen, men denne gang sammen med current_date() for at vise datoen, hvor jeg kørte forespørgslen.

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

Resultat:

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

Eksempel 2 – Brug en tilpasset dato

I dette eksempel giver jeg to datoer at sammenligne med. Derfor er alderen ikke baseret på dagens dato. Den er baseret på den første dato, der blev givet til age() funktion.

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

Resultat:

9 mons 18 days

I dette tilfælde er alderen mindre end et år, så året er ikke nævnt i resultaterne.

Her er et andet eksempel, der viser, hvad der sker, hvis kun året ændrer sig (dvs. måneds- og dagdelene af de to datoer er nøjagtig de samme, men året er forskelligt).

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

Resultat:

7 years

Så igen udelader den simpelthen de dele, der ikke er relevante (i dette tilfælde måneder og dage).

Eksempel 3 – Identiske datoer

Her er, hvad der sker, hvis begge datoer er de samme.

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

Resultat:

00:00:00

Eksempel 4 – Negativ alder

Hvis den anden date er senere end den første date, ender du med en negativ alder.

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

Resultat:

-1 years -2 mons -6 days

Her er minustegnet sat foran alle komponenter af datoen (dvs. komponenterne år, måned og dage).

Eksempel 5 – Alder i år

Hvis du kun ønsker alderen i år, kan du bruge enten extract() eller date_part() for at udtrække året fra age() funktions returværdi.

Her er et eksempel, der bruger extract() funktion:

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

Resultat:

22.0

Sådan ser det ud, når jeg kører det i Azure Data Studio.

Når jeg kører det i psql , jeg forstår dette:

22

Begge extract() og date_part() returnere deres resultater ved hjælp af datatypen med dobbelt præcision.

Du kan konvertere dette til et heltal (eller anden datatype), hvis det kræves, ved at tilføje det med ::int .

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

Resultat:

22

  1. Multi-sætning tabel værdisat funktion vs inline tabel værdisat funktion

  2. Er postgres JSON-indekser effektive nok sammenlignet med klassiske normaliserede tabeller?

  3. Valg af første række pr. gruppe

  4. Bulk Insert til Oracle ved hjælp af .NET