Práce s časem a datem v MySQL
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]
To je pro dnešek vše. Třeba to ještě časem rozšířím.