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

Sådan finder du intervallet mellem to datoer i PostgreSQL

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

  1. Hvordan genererer jeg et tilfældigt tal for hver række i en T-SQL-selektion?

  2. En oversigt over de forskellige scanningsmetoder i PostgreSQL

  3. Oracle Concurrent Manager – CP Analyzer til E-Business Suite

  4. JPA SQL Server Ingen dialekttilknytning for JDBC-type:-9