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 |