V předchozím díle jsem začal povídání o vestavěných funkcích. V dnešním díle bych rád tuto kapitolu dokončil povídáním o funkcích, které mají něco do činění s datumem a časem.
Funkce pro práci s datumem a časem
V jednom z
předchozích dílů jsem uvedl, že MySQL má bohatý výčet datových typů, které slouží k uchovávání datumu a času. Nyní si ve stručnosti ukážeme, jak se s poli obsahující datum nebo čas dá efektivně pracovat za pomocí funkcí.
Tato část funkcí vrací z datumu den v týdnu, měsíci, roku… apod. Nejčastěji je setkáte s následujícími funkcemi:
Syntaxe funkce |
Popis |
DAYOFWEEK(datum) |
Vrací číslo dne v týdnu. (1 = neděle, 2 = pondělí,…. 7 = sobota) |
WEEKDAY(datum) |
Vrací číslo dne v týdnu (0 = pondělí, 1 = úterý,… 6 = sobota) |
DAYOFMONTH(datum) |
Vrací číslo dne v měsíci (interval 1 – 31). |
DAYOFYEAR(datum) |
Vrací den v roce (interval 1 – 366) |
Myslím, že samotný název funkcí mluví za vše. Zde vás může trochu zarazit fakt, že funkce DAYOFWEEK a WEEKDAY jsou funkčně totožné, ale každá z nich vrací pro jednotlivé dny v týdnu jiné číslo. Na toto pozor! Často se tyto funkce berou jako ekvivalentní, a jsou proto ve výsledku častým zdrojem chyb. Kterou z nich si tedy vybrat? Doporučuji raději využívat funkci DAYOFWEEK, která koresponduje s ODBC standardem.
Příklad:
SELECT DAYOFWEEK (`1998-02-03`);
Výstupem bude číslo 3 tj. úterý. Jak již víte z dřívějška, MySQL je celkem benevolentní k zápisu datumu. Zápisy (‘1998-02-03‘), (‘1998.02.03‘) či (‘19980203‘) jsou tudíž ekvivalentní. Totožný je zápis i u ostatních funkcí.
Funkce pro práci s názvy dnů a měsíců
Do této kategorie spadají „pouze“ dvě funkce:
Syntaxe |
Popis |
DAYNAME(datum) |
Vrací den v týdnu (slovně). |
MONTHNAME(datum) |
Vrací měsíc (slovně). |
Tyto funkce, jak jste již možná zjistili, moc nevyužijete. Obě totiž vracejí text v angličtině (např. „Monday“), a tak budete nejspíš místo nich využívat ty, které jsem uvedl o odstavec výše. Výčet těchto funkcí jsem uvedl spíše pro úplnost.
Funkce pro práci s týdny, měsíci, čtvrtletími a roky
Tyto funkce pracují obdobně jako funkce, které mají co do činění s dny, tj. vrací číselnou hodnotu, která reprezentuje určitý údaj, např. číslo měsíce … apod. Přehled těchto funkcí naleznete v následující tabulce:
Syntaxe |
Popis |
WEEK(datum) |
Vrací číslo týdne v roce (interval 0 až 53). |
WEEK(datum, první_den) |
Vrací číslo týdne v roce (interval 0 až 53) s určením prvního dne v týdnu. |
MONTH(datum) |
Vrací číslo měsíce v roce (interval 1 až 12). |
QUARTER(datum) |
Vrací číslo čtvrtletí v roce (interval 1 až 4) |
YEAR(datum) |
Vrací rok. |
Význam funkcí je opět vcelku jasně pochopitelný až na funkci WEEK. Tato funkce může mít jeden nebo dva parametry. Jak mnozí víte, podle anglického kalendáře začíná týden nedělí. Pokud – dejme tomu – byl 2. leden 1982 sobota (pozn: nejspíš nebyl), bude jako výsledek funkce WEEK s jedním parametrem vrácena 0, tj. nultý týden. Pokud však uvedeme jako „startovní den“ sobotu (tj. č. 6), je navrácen první týden. Příklad:
SELECT WEEK(‘1982-01-02‘, 6);
Jako existují funkce pro práci s datem, tak podobné existují i pro práci s časem.
Syntaxe |
Popis |
SECOND(čas) |
Vrací sekundu z formátu času (interval 0 až 59) |
MINUTE(čas) |
Vrací minutu z formátu času (interval 0 až 59). |
HOUR(čas) |
Vrací hodinu z formátu času (interval 0 až 23). |
Příklad:
SELECT MINUTE(`98-02-03 10:05:03`);
Z předcházejícího příkladu je jasně patrné, že jako parametr funkce můžete uvést jak samotný čas, tak i kombinaci datumu a času.
Vygenerování aktuálního datumu a času
Velice často jste postaveni před „problém“, jak co nejlépe a nejefektivněji vygenerovat aktuální čas, datum nebo kombinaci obojího. Jak uvidíte na následujících příkladech, můžete to s klidným svědomím nechat na MySQL.
Syntaxe |
Popis |
NOW() |
Vrací aktuální datum a čas. |
SYSDATE() |
Vrací aktuální datum a čas. |
CURRENT_TIMESTAMP |
Vrací aktuální datum a čas. |
CURTIME() |
Vrací aktuální čas. |
CURRENT_TIME |
Vrací aktuální čas. |
CURDATE() |
Vrací aktuální datum. |
CURRENT_DATE() |
Vrací aktuální datum. |
Použití je opět velice snadné. Například funkce NOW() vrátí aktuální datum a čas ve formátu YYYY-MM-DD HH:MM:SS. Pokud byste chtěli vygenerovat aktuální datum a čas ve formátu YYYYMMDDHHMMSS, pak napíšete NOW()+0. U ostatních funkcí se postupuje ekvivalentně.
Asi nejdůležitější věcí, která je spojena se všemi funkcemi, je výstup. Bez dobrého výstupu jsou veškerá shromažďovaná data absolutně nepoužitelná. U výstupu údajů o datu a času to platí dvojnásob. Nejspíš právě proto má MySQL tak bohaté možnosti. V souvislosti s formátováním se v MySQL můžete setkat se dvěmi funkcemi. Konkrétně se jedná o
DATE_FORMAT(datum, formát) a
TIME_FORMAT(čas, formát). První parametr udává datum resp. čas a druhý parametr formátování. K formátování můžete využít bohatou kolekci hodnot – viz následující tabulka:
Hodnota |
Popis |
%M |
Název měsíce – ovšem anglicky (January, February... atd.) |
%W |
Den v týdnu – ovšem anglicky (Sunday, Monday... atd.) |
%D |
Den v měsíci ve formátu anglické číslovky (1st, 2nd, 3rd... atd.) |
%Y |
Rok ve čtyřmístném formátu (např. 2001) |
%y |
Rok ve dvoumístném formátu (např. 01) |
%X & %V |
Rok a číslo týdne v roce. Neděle je brána jako první den v týdnu. |
%x & %v |
Rok a číslo týdne v roce. Zde je bráno pondělí jako první den v týdnu. |
%a |
Zkrácený název dne v týdnu – ovšem anglicky (např. Sun, Mon... atd.) |
%d |
Den v měsíci (rozmezí 00-31) |
%e |
Den v měsíci (rozmezí 0-31) |
%m |
Měsíc (rozmezí 01-12) |
%c |
Měsíc (rozmezí 1-12) |
%b |
Zkrácený název měsíce – ovšem anglicky (např. Jan, Feb... atd.) |
%j |
Den v roce (rozmezí 001-366) |
%H |
Hodina (rozmezí 00-23) |
%k |
Hodina (rozmezí 0-23) |
%h |
Hodina (rozmezí 01-12) |
%I |
Hodina (rozmezí 01-12) |
%l |
Hodina (rozmezí 1-12) |
%i |
Minuta (rozmezí 00-59) |
%r |
Tzv. dvanáctihodinový formát času (HH:MM:SS [AP]M) |
%T |
Tzv. čtyřiadvacetihodinový formát času (HH:MM:SS) |
%S |
Sekunda (00-59) |
%s |
Sekunda (00-59) |
%p |
AM nebo PM |
%w |
Den v týdnu (rozmezí 0-6, 0 = Sunday...atd.) |
%U |
Číslo týdne v roce (rozmezí 0-53). Jako první den v týdnu je brána neděle. |
%u |
Číslo týdne v roce (rozmezí 0-53). Jako první den v týdnu je bráno pondělí. |
%% |
Literál %. |
Jak vidíte, seznam hodnot je velice bohatý, a je tedy pouze na vás, které použijete. Pro ilustraci uvedu pár příkladů:
SELECT DATE_FORMAT(`1997-10-04 22:23:00`, `%H:%i:%s`);
Výsledek: `22:23:00`
SELECT DATE_FORMAT(`1999-01-01`, `%X %V`);
Výsledek: `1998 52`
Obdobným způsobem se používá i funkce TIME_FORMAT.
Možnosti použití funkcí pro práci s datumem a časem jsou daleko bohatší. Nebylo mou snahou popsat všechny možnosti. To by totiž samo o sobě dalo na menší seriál. Myslím ale, že jsem shrnul alespoň to podstatné. To by bylo tedy pro dnešek vše. Příště vám povím něco o zámcích a klíčích.