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 |