MySQL má spoustu užitečných funkcí pro manipulaci s datem a časem, které mohou programátorovi ušetřit spoustu času. Tady bych chtěl ukázat některé praktické příklady jejich použití.
Datové typy
- Date
- Datový typ Date uloží datum ve formát ‚YYYY-MM-DD‘. Povolený rozsah je od 100001-01 do 9999-12-31.
- Datetime
- Datový typ Datetime obsahuje datum a čas ve formátu ‚YYYY-MM-DD HH:MM:SS‘. Povolený rozsah je od 1000-01-01 00:00:00 do 9999-12-31 23:59:59.
- Time
- Datový typ Time obsahuje čas ve formátu ‚HH:MM:SS‘. Povolený rozsah je od −838:59:59 do 838:59:59.
- Year
- Datový typ Year obsahuje rok. Může být dvou nebo čtyřciferný. Pokud je dvouciferný, tak povolený rozsah hodnot je od 70 do 69 (roky 1970–1969). Čtyřciferný formát (defaultní) umožňuje uložit hodnoty v rozsahu 1901–2155 a 0000.
- Timestamp
- Timestamp umožňuje uložit datum ve formátu 1970-01-01 00:00:00 až do roku 2037. Tento datový typ je velmi užitečný pro zaznamenávání času operací INSERT a UPDATE. Do prvního sloupce v tabulce, který má datový typ Timestamp se automaticky (pokud nedáme databázi jiné instrukce) uloží čas poslední operace.
Praktické příklady
Získání aktuálního času a data
-- Získání aktuálního času a data SELECT NOW(); -- Aktuální čas SELECT CURTIME(); -- Aktuální datum SELECT CURDATE();
Formátování data
Defaultní formát data v MySQL není příliš vhodný pro zobrazení. Někdo to řeší mim databázi, ale já osobně raději využívám shcopností databází. MySQL má pro formátování data funkci Date_Format. [1]
-- Tento dotaz vrátí datum ve formátu dd.mm. YYYY SELECT Date_Format(`Datum`,'%d.%m. %Y') AS `Datum` FROM `tabulka`; -- Aktuální datum a čas SELECT Date_Format(NOW(), '%d.%m. %Y %H:%i');
Automatické odhlášení
V rámci zabezpečení je vhodné do sytému, kde se musí uživatelé logovat implementovat automatické odhlášení (po určité době nečinnosti). Nejčastěji se pro monitorování uživatele používá databáze. Pokud máme tabulku, ve které je uložen login uživatele a čas jeho poslední akce:
+------+---------------------+ |Login | Time | +------+---------------------+ |Franta| 2006-04-29 15:20:23 | +------+---------------------+ |Pepa | 2006-04-29 06:45:08 | +------+---------------------+ |Milan | 2006-04-29 09:22:14 | +------+---------------------+
Potřebujeme zjistit všechny uživatele, kteří po dobu jedné hodiny neprovedli žádnou akci.
SELECT `Login` FROM `table` WHERE `Time` < NOW() - INTERVAL 1 HOUR; -- NEBO SELECT `Login` FROM `table` WHERE `Time` < NOW() - INTERVAL 60 MINUTE; -- A NEBO SELECT `Login` FROM `table` WHERE `Time` < NOW() - INTERVAL '59:60' MINUTE_SECOND;
Tento zápis je funkční od verze 3.23. U starší verze musíme volat funkci Date_Add. [2]
Unixtimestamp
Unixtimestamp je číslo, které udává počet sekund od 1. ledna 1970. Tento formát času se často používá v PHP. Proto je dobré vědět, jak ho získat z MySQL.
Funkce Unix_Timestamp převede argument na unixtimestamp. Pokud ji zavoláme bez argumentu, tak nám vrátí aktuální čas. [3]
-- Následující dva dotazy vrátí stejný výsledek SELECT UNIX_TIMESTAMP(); SELECT UNIX_TIMESTAMP(NOW());
Převod opačným směrem provádí funkce From_Unixtime. [4]