Porovnávání a manipulace s daty v MySQL: Kompletní průvodce s příklady a tipy na výkon

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.

  1. 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.
  1. 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.
  1. 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.

  1. = (Rovná se)
  • Načte záznamy, které odpovídají specifikovanému datu.
    SELECT * FROM events WHERE event_date = '2025-01-01';
    
  1. > / < (Větší než / Menší než)
  • Hledá záznamy před nebo po specifikovaném datu.
    SELECT * FROM events WHERE event_date > '2025-01-01';
    
  1. <= / >= (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:

  • BETWEEN zahrnuje 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_monthtotal_events
110
215

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 BETWEEN zahrnuje 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 TIMESTAMP závislý na časovém pásmu. Naopak typ DATETIME uklá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() nebo NOW() s INTERVAL pro 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 WHERE můž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í:

  1. Porozumění vlastnostem a správnému použití datových typů pro datum (DATE, DATETIME, TIMESTAMP).
  2. Základní metody porovnávání ( = , > , < , BETWEEN , atd.).
  3. Výpočet rozdílů mezi daty ( DATEDIFF() , TIMESTAMPDIFF() ).
  4. 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.