sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man hittar intervallet mellan två datum i PostgreSQL

Problem:

Du vill hitta skillnaden mellan två datum/datumtid-värden i en PostgreSQL-databas.

Exempel:

Vår databas har en tabell som heter employment med data i kolumnerna id , first_name , last_name , start_date och end_date :

id förnamn efternamn startdatum slutdatum
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

Låt oss för varje anställd få deras för- och efternamn och skillnaden mellan start- och slutdatum för deras anställning. Vi vill se intervallet i år, månader och dagar.

Lösning 1:

Vi använder AGE() fungera. Här är frågan du skulle skriva:

SELECT first_name, 
             last_name, 
             AGE(end_date, start_date) 
         AS  employment_interval 
FROM employment;

Här är resultatet av frågan:

förnamn efternamn anställningsintervall
Barbara Wilson 8 år 8 månader 29 dagar
Robert Anderson 10 år 8 månader 3 dagar
Steven Nelson 14 år 3 månader 22 dagar

Diskussion:

Använd PostgreSQL AGE() funktion för att hämta intervallet mellan två tidsstämplar eller datum. Den här funktionen tar två argument:det första är slutdatumet och det andra är startdatumet. I vårt exempel använder vi kolumnen end_date (dvs när den anställde slutade göra det jobbet) och kolumnen start_date (när den anställde började det jobbet).

Skillnaden mellan datum returneras som ett intervall i år, månader, dagar, timmar, etc. Frågan för Steven Nelson returnerade anställningstiden som intervallet "14 years 3 months 22 days ’; det här är skillnaden mellan 2005-06-01, när han började det här jobbet, och 2019-09-23, när han slutade det.

AGE() funktionen kan också visa skillnaden mellan aktuell tidsstämpel/datum och det första argumentet. I det här fallet har funktionen bara ett argument:

SELECT first_name,
             last_name,
             AGE(end_date)
         AS  employment_interval
FROM employment;

Frågan ovan visar intervallet mellan den aktuella tidsstämpeln (för den här texten är det '2019-09-26') och varje anställds slutdatum (kolumnen end_date ).

förnamn efternamn anställningsintervall
Barbara Wilson 10 månader 27 dagar
Robert Anderson 7 år 9 månader 6 dagar
Steven Nelson 3 dagar

Tre dagar har förflutit mellan Stevens sista dag på jobbet och den aktuella tidsstämpeln (i skrivande stund är det 2019-09-26).

Lösning 2:

Du kan också använda minusoperatorn ( '-' ) istället för AGE() för att subtrahera två datum.

Här är frågan du skulle skriva:

SELECT first_name,
             last_name,
             end_date::DATE – start_date::DATE 
         AS  employment_interval 
FROM employment;

I det här resultatet ser du bara skillnaden i dagar (inte år, månader och dagar):

förnamn efternamn anställningsintervall
Barbara Wilson 3193
Robert Anderson 3899
Steven Nelson 5227

  1. Förhindra rekursiv trigger i PostgreSQL

  2. Stöder din Salesforce-drivrutin bulkåtgärder?

  3. Kan jag lagra binär sträng i CLOB-kolumnen

  4. Felsökning av CPU-prestanda på VMware