1. Úvod
Práce s daty v MySQL je jedním z nejdůležitějších aspektů operací s databází. Například při agregaci dat o prodejích podle data nebo hledání záznamů v určitém období se porovnání dat stává nezbytným.
Tento článek vysvětluje vše od základů manipulace a porovnávání dat v MySQL až po pokročilé případy použití a techniky optimalizace výkonu. Je navržen tak, aby byl užitečný pro uživatele na všech úrovních, od začátečníků po středně pokročilé vývojáře.
2. Přehled datových typů MySQL pro datum
Typy datových typů pro datum a jejich charakteristiky
MySQL poskytuje následující tři hlavní datové typy pro datum. Níže je krátké vysvětlení každého.
- DATE
- Uložená hodnota: Rok-Měsíc-Den (
YYYY-MM-DD) - Charakteristiky: Nezahrnuje informace o čase, což ho činí vhodným pro správu jednoduchých dat.
- Případy použití: Narozeniny, lhůty.
- DATETIME
- Uložená hodnota: Rok-Měsíc-Den a Čas (
YYYY-MM-DD HH:MM:SS) - Charakteristiky: Zahrnuje informace o čase, což ho činí vhodným pro záznam přesných časových razítek.
- Případy použití: Časová razítka vytvoření, časová razítka poslední aktualizace.
- TIMESTAMP
- Uložená hodnota: Rok-Měsíc-Den a Čas (
YYYY-MM-DD HH:MM:SS) - Charakteristiky: Závisí na časové zóně, což ho činí užitečným pro správu dat a času napříč různými regiony.
- Případy použití: Logovací data, záznamy transakcí.
Jak vybrat vhodný datový typ
- Pokud není čas vyžadován, zvolte DATE .
- Pokud je čas vyžadován, zvolte DATETIME nebo TIMESTAMP v závislosti na požadavcích vaší aplikace na časovou zónu.
Ukázkový dotaz
Níže je příklad používající každý datový typ.
CREATE TABLE events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
event_date DATE,
event_datetime DATETIME,
event_timestamp TIMESTAMP
);
3. Jak porovnávat data
Použití základních operátorů porovnání
V MySQL se pro porovnání dat používají následující operátory.
=(Rovná se)
- Načte záznamy, které odpovídají specifikovanému datu.
SELECT * FROM events WHERE event_date = '2025-01-01';
>/<(Větší než / Menší než)
- Hledá záznamy před nebo po specifikovaném datu.
SELECT * FROM events WHERE event_date > '2025-01-01';
<=/>=(Menší nebo rovno / Větší nebo rovno)
- Hledá v rozsahu, který zahrnuje specifikované datum.
SELECT * FROM events WHERE event_date <= '2025-01-10';
Rozsahové dotazy pomocí BETWEEN
Operátor BETWEEN vám umožňuje snadno specifikovat rozsah dat.
SELECT * FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
Důležitá poznámka:
BETWEENzahrnuje jak počáteční, tak koncovou hodnotu, takže se ujistěte, že žádná požadovaná data nejsou neúmyslně vyloučena z vašeho rozsahu.
4. Výpočet rozdílů mezi daty
Použití funkce DATEDIFF
Funkce DATEDIFF() vypočítá rozdíl (v dnech) mezi dvěma daty.
SELECT DATEDIFF('2025-01-10', '2025-01-01') AS days_difference;
Výsledek:
- 9 dní
Použití funkce TIMESTAMPDIFF
Funkce TIMESTAMPDIFF() vám umožňuje vypočítat rozdíl v specifických jednotkách, jako jsou roky, měsíce, dny nebo hodiny.
SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-12-31') AS months_difference;
Výsledek:
- 11 měsíců
5. Přičítání a odečítání dat
Manipulace s daty pomocí klauzule INTERVAL
V MySQL můžete snadno přičíst nebo odečíst čas od data pomocí klauzule INTERVAL. To vám umožňuje vytvářet dotazy, které načtou data před nebo po určitém období.
Přičítání k datu
Příklad přičítání času k datu pomocí INTERVAL:
SELECT DATE_ADD('2025-01-01', INTERVAL 7 DAY) AS plus_seven_days;
Výsledek:
2025-01-08
Odečítání od data
Můžete odečíst čas od data podobným způsobem pomocí INTERVAL:
SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH) AS minus_one_month;
Výsledek:
2024-12-01
Případ použití: Systém připomínek
Níže je ukázkový dotaz, který získává události probíhající přesně před sedmi dny, což lze použít pro odesílání automatizovaných připomínkových oznámení.
SELECT event_name, event_date
FROM events
WHERE event_date = DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Výpočty založené na aktuálním datu
CURDATE(): Vrací aktuální datum (YYYY-MM-DD).NOW(): Vrací aktuální datum a čas (YYYY-MM-DD HH:MM:SS).
Příklad: Vypočítejte datum o jeden týden od dneška.
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;
6. Praktické příklady dotazů
Získat záznamy pro konkrétní datum
Získat události, které odpovídají zadanému datu.
SELECT *
FROM events
WHERE event_date = '2025-01-01';
Získat data v rámci časového intervalu
Příklad vyhledávání událostí v rámci jednoho týdne.
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07';
Agregace dat podle data
Tento dotaz počítá, kolik událostí je registrováno pro každý měsíc.
SELECT MONTH(event_date) AS event_month, COUNT(*) AS total_events
FROM events
GROUP BY MONTH(event_date);
Příklad výsledku:
| event_month | total_events |
|---|---|
| 1 | 10 |
| 2 | 15 |
7. Optimalizace výkonu
Efektivní vyhledávání pomocí indexů
Nastavení indexu na sloupec s datem může výrazně zlepšit výkon dotazu.
Vytvoření indexu
Následující SQL vytvoří index na sloupci event_date.
CREATE INDEX idx_event_date ON events(event_date);
Kontrola vlivu indexu
Můžete použít EXPLAIN k ověření plánu provedení dotazu.
EXPLAIN SELECT *
FROM events
WHERE event_date = '2025-01-01';
Důležité poznámky při používání funkcí
Používání funkcí v klauzuli WHERE může znemožnit využití indexu.
Špatný příklad
V následujícím dotazu funkce DATE() zabraňuje použití indexu.
SELECT *
FROM events
WHERE DATE(event_date) = '2025-01-01';
Vylepšený příklad
Doporučuje se porovnávat hodnoty přímo, bez použití funkcí.
SELECT *
FROM events
WHERE event_date >= '2025-01-01'
AND event_date < '2025-01-02';

8. Často kladené otázky (FAQ)
Q1: Jaký je rozdíl mezi DATE a DATETIME?
- A1:
- DATE: Ukládá pouze datum (
YYYY-MM-DD). Použijte, když není potřeba časová informace. - DATETIME: Ukládá datum i čas (
YYYY-MM-DD HH:MM:SS). Použijte, když je vyžadován přesný časový údaj události.
Příklad:
CREATE TABLE examples (
example_date DATE,
example_datetime DATETIME
);
Q2: Na co si dát pozor při specifikaci časového intervalu pomocí BETWEEN?
- A2:
- Vzhledem k tomu, že
BETWEENzahrnuje jak počáteční, tak koncové datum, pokud koncové datum neobsahuje časovou hodnotu, nemusíte získat všechny zamýšlené záznamy.
Příklad:
-- This query may not retrieve records such as "2025-01-31 23:59:59"
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
Vylepšení:
Explicitně nastavte koncový čas na 23:59:59 nebo použijte porovnání, které ignoruje časovou část.
SELECT *
FROM events
WHERE event_date >= '2025-01-01' AND event_date < '2025-02-01';
Q3: Jak zacházet s rozdíly časových pásem?
- A3: V MySQL je typ
TIMESTAMPzávislý na časovém pásmu. Naopak typDATETIMEukládá pevnou hodnotu a není ovlivněn časovými pásmy.
Zkontrolujte aktuální nastavení časového pásma:
SHOW VARIABLES LIKE 'time_zone';
Změna nastavení časového pásma:
SET time_zone = '+09:00'; -- Japan Standard Time (JST)
Q4: Jak mohu získat data z posledních 30 dnů?
- A4: Můžete kombinovat
CURDATE()neboNOW()sINTERVALpro získání dat z posledních 30 dnů.
Příklad:
SELECT *
FROM events
WHERE event_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
Q5: Jak mohu zlepšit výkon porovnávání dat?
- A5:
- Vytvořte indexy: Nastavte index na sloupcích s daty.
- Vyhněte se používání funkcí: Používání funkcí v klauzuli
WHEREmůže zneplatnit indexy, proto použijte přímá porovnání místo nich.
9. Shrnutí
Klíčové body tohoto článku
Tento článek poskytl komplexní vysvětlení technik manipulace s daty a jejich porovnávání v MySQL. Hlavní poznatky jsou následující:
- Porozumění vlastnostem a správnému použití datových typů pro datum (DATE, DATETIME, TIMESTAMP).
- Základní metody porovnávání (
=,>,<,BETWEEN, atd.). - Výpočet rozdílů mezi daty (
DATEDIFF(),TIMESTAMPDIFF()). - Zlepšení výkonu pomocí indexování a optimálního návrhu dotazů.
Doufáme, že vám tento průvodce pomůže efektivně pracovat s operacemi s daty v MySQL a vytvářet praktické, optimalizované dotazy pro reálné aplikace.


