sql >> Databáze >  >> RDS >> PostgreSQL

Jak najít interval mezi dvěma daty v PostgreSQL

Problém:

Rádi byste našli rozdíl mezi dvěma hodnotami data/datetime v databázi PostgreSQL.

Příklad:

Naše databáze obsahuje tabulku s názvem employment s údaji ve sloupcích id , first_name , last_name , start_date a end_date :

id first_name last_name počáteční_datum end_date
1 Barbara Wilson 2010-02-01 2018-10-30
2 Robert Anderson 2001-04-17 20. 12. 2011
3 Steven Nelson 2005-06-01 23. 9. 2019

U každého zaměstnance uveďme jeho jméno a příjmení a rozdíl mezi datem zahájení a ukončením jeho zaměstnání. Chceme vidět interval v letech, měsících a dnech.

Řešení 1:

Použijeme AGE() funkce. Zde je dotaz, který byste napsali:

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

Zde je výsledek dotazu:

first_name last_name interval_zaměstnání
Barbara Wilson 8 let 8 měsíců 29 dní
Robert Anderson 10 let 8 měsíců 3 dny
Steven Nelson 14 let 3 měsíce 22 dní

Diskuse:

Použijte PostgreSQL AGE() funkce pro načtení intervalu mezi dvěma časovými razítky nebo daty. Tato funkce má dva argumenty:první je koncové datum a druhý je počáteční datum. V našem příkladu používáme sloupec end_date (tj. když zaměstnanec přestal vykonávat danou práci) a sloupec start_date (kdy zaměstnanec nastoupil do této práce).

Rozdíl mezi daty je vrácen jako interval v letech, měsících, dnech, hodinách atd. Dotaz pro Stevena Nelsona vrátil dobu zaměstnání jako interval ‘14 years 3 months 22 days '; to je rozdíl mezi rokem 2005-06-01, kdy nastoupil do této práce, a 2019-09-23, kdy ji ukončil.

AGE() funkce může také zobrazit rozdíl mezi aktuálním časovým razítkem/datem a prvním argumentem. V tomto případě má funkce pouze jeden argument:

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

Výše uvedený dotaz zobrazuje interval mezi aktuálním časovým razítkem (pro tento text je to ‚2019-09-26‘) a datem ukončení každého zaměstnance (sloupec end_date ).

first_name last_name interval_zaměstnání
Barbara Wilson 10 měsíců 27 dní
Robert Anderson 7 let 9 měsíců 6 dní
Steven Nelson 3 dny

Mezi Stevenovým posledním dnem v práci a aktuálním časovým razítkem uplynuly tři dny (v době psaní tohoto článku to je 26. 9. 2019).

Řešení 2:

Místo AGE() můžete také použít operátor mínus ( ‚-‘ ). odečíst dvě data.

Zde je dotaz, který byste napsali:

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

V tomto výsledku uvidíte rozdíl pouze ve dnech (nikoli v letech, měsících a dnech):

first_name last_name interval_zaměstnání
Barbara Wilson 3193
Robert Anderson 3899
Steven Nelson 5227

  1. Připojte tabulky ze dvou různých serverů

  2. Existuje nějaký způsob, jak zkontrolovat výkon indexování mysql

  3. Spravovaná knihovna ODP.NET řeší alias, ale 32bitová knihovna ano

  4. Zálohovat pouze schéma SQL?