Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyDatabázové systémy v biomedicíně Funkce a operátory v SQL Funkce Datumové funkce

Logo Matematická biologie

Datumové funkce

Nejvýznamnější funkce pro datový typ datum jsou:

  • Funkce vracející aktuální datum a čas
  • Funkce pro práci s časovým intervalem
  • Funkce pro formátování vstupního či výstupního data 
     

Standardní funkcí, která vrátí systémové datum je CURRENT_DATE, v jednotlivých databázových systémech se však může lišit její návratová hodnota. V ORACLE je synonymem funkce SYSDATE, která vrátí aktuální datum i čas s přesností na sekundy. V databázi PGSQL vrací tato funkce pouze datum. Standardní funkcí pro získání aktuálního času je CURRENT_TIME, která však není dostupná ORACLE. Funkce CURRENT_TIMESTAMP je dostupná v ORACLE i PGSQL a vrací datum i čas.

Jak bylo zmíněno výše, pro práci s datumy lze využívat operátory + a - . Takto lze pracovat, pokud pracujeme v jednotkách dnů či týdnů. Problém je, pokud potřebujeme pracovat s přesností na měsíce nebo roky. Kalendářní měsíc má 28 - 31 dnů, rok má 365 nebo 366 dnů. Vyjádřit rozdíl mezi dvěma daty jako počet měsíců nebo let bez zaokrouhlování není tedy zcela triviální. ORACLE nabízí pro tyto úlohy 2 velmi užitečné funkce: ADD_MONTHS a MONTHS_BETWEEN. První umožňuje přičítat či odečítat měsíce k danému datu, druhá vrací počet měsíců mezi dvěma daty. Protože rok má vždy 12 měsíců, je možné s pomocí uvedených funkcí pracovat i s roky. Příklad ukazuje, jak zjistit současný věk osoby, pokud máme v databázi uloženo datum narození. Současný věk odpovídá rozdílu aktuálního data a data narození v měsících, pokud toto číslo podělíme 12 a zaokrouhlíme dolů na celé číslo, dostáváme věk v letech.

SELECT TRUNC (MONTHS_BETWEEN (CURRENT_DATE, date_of_birth)/12)  FROM patients

Databáze PGSQL nabízí funkci AGE pro výpočet rozdílu mezi dvěma daty.

SELECT AGE (current_date, date_of_birth) FROM  patients

 

Formátování datumu

Datum a čas je databází interně ukládán jako číslo, které udává počet dnů od databázově specifického výchozího data. Pokud chceme datum zobrazit jako výsledek SQL dotazu, databáze transformuje toto číslo do defaultního formátu. Tento formát nám ale často nevyhovuje. Máme ale k dispozici (ORACLE i PGSQL) formátovací funkci TO_CHAR, která nám umožňuje přesně specifikovat výstupní formát. Funkce má dva parametry, prvním je formátované datum (sloupec tabulky s datumovým typem), druhým je specifikace formátu ohraničená apostrofy. Pro specifikaci formátu se využívají zástupné znaky, seznam nejčastěji používaných uvádí tabulka 3.

Tab 3: Symboly pro formátování datumu

Symbol Popis
dd den měsíce
mm kalendářní měsíc (1-12)
yyyy kalendářní rok
hh24 hodiny (0-23)
mi minuty (0-59)
ss sekundy (0-59)
ww číslo týdne v roce

 

Pokud chceme zobrazit datum a čas dle českých zvyklostí, specifikujeme formát následovně

SELECT TO_CHAR(CURRENT_TIMESTAMP, 'dd. mm. yyyy hh24:mi:ss') FROM DUAL

Výsledek je 20. 7. 2013 10:13:23.

Pokud chceme formát datumu vhodný ke třídění, použijeme

 SELECT TO_CHAR(CURRENT_TIMESTAMP, 'yyyy-mm-dd') FROM DUAL

S formátem datumu je problém i při vkládání dat do databáze. Aby databáze byla schopna převést vkládané datum do svého interního formátu, musíme opět přesně specifikovat vkládaný formát. Použijeme k tomu funkci TO_DATE, jejímž prvním parametrem je textový řetězec představující vkládané datum, druhý parametr je opět specifikace formátu. Specifikace formátu je shodná jako v případě funkce TO_CHAR. Příkaz INSERT pro vložení data do tabulky patients, vypadá takto

INSERT INTO patients (date_of_birth) VALUES (TO_DATE('13.3.1950','dd.mm.yyyy'))

Nezkušení uživatelé databáze často funkce TO_CHAR a T0_DATE zaměňují, což může způsobit buď chybu při vykonávání SQL příkazu, v horším případě pak vrácení či vložení chybných dat. Pravidlo je přitom jednoduché, pokud je prvním parametrem textový sloupec nebo text v apostrofech, musí jít vždy o funkci TO_DATE, pokud je parametrem datumový sloupec nebo zmíněné funkce vracející aktuální datum a čas, je na místě funkce TO_CHAR. Funkce TO_CHAR a TO_DATE lze kombinovat, například pokud chceme přeformátovat datumovou konstantu.

SELECT TO_CHAR(TO_DATE('22.3.2000','dd.mm.yyyy'), 'yyyy-mm') FROM DUAL;

Dotaz v příkladu nejprve specifikované datum převede do interního formátu a následně ho funkce TO_CHAR zobrazí ve formátu rok-měsíc.

Extrahovat komponenty data lze také pomocí funkce EXTRACT. Pomocí této funkce můžeme z data získat rok (YEAR), měsíc (MONTH), den (DAY)

SELECT EXTRACT(YEAR FROM TO_DATE('22.3.2000','dd.mm.yyyy')) FROM DUAL;

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity