MySQL DATETIME vysvětleno: datový typ, rozsah a osvědčené postupy

1. Co je MySQL DATETIME?

MySQL DATETIME je datový typ používaný k uložení jak data, tak času v jednom poli. Správa hodnot data a času v databázi je nezbytná pro mnoho aplikací, například pro logování a rezervační systémy. Typ DATETIME ukládá datum a čas dohromady a podporuje široký rozsah hodnot. Jeho rozsah je od '1000-01-01 00:00:00' do '9999-12-31 23:59:59' a také podporuje zlomkové sekundy.

2. Přehled datových typů MySQL pro datum a čas

2.1 Datové typy pro práci s daty a časy

MySQL poskytuje následující datové typy pro práci s daty a časy:

  • DATE : Ukládá datum (rok, měsíc, den). Rozsah je '1000-01-01''9999-12-31'.
  • TIME : Ukládá pouze čas. Rozsah je '-838:59:59''838:59:59'.
  • DATETIME : Ukládá jak datum, tak čas. Rozsah je '1000-01-01 00:00:00''9999-12-31 23:59:59'.
  • TIMESTAMP : Ukládá UNIX timestamp. Rozsah je '1970-01-01 00:00:01''2038-01-19 03:14:07'.

2.2 Rozdíly mezi DATETIME a TIMESTAMP

DATETIME a TIMESTAMP jsou si podobné, ale mají následující rozdíly:

  • Časové pásmo : DATETIME ukládá pevnou hodnotu, která nezávisí na časových pásmech. Naopak TIMESTAMP se při uložení převede na UTC a při načtení se převede na aktuální časové pásmo serveru. Kvůli tomu je DATETIME vhodný pro časově nezávislé hodnoty (například časy událostí), zatímco TIMESTAMP je vhodný pro data svázaná s časovým pásmem serveru, jako jsou logy.
  • Formát uložení : DATETIME se ukládá tak, jak je, zatímco TIMESTAMP se ukládá jako UNIX timestamp. Výsledkem je, že hodnoty TIMESTAMP jsou ovlivněny nastavením časového pásma serveru při jejich reprezentaci.

3. Jak používat DATETIME v MySQL

3.1 Vytvoření sloupce DATETIME

Pro vytvoření sloupce s typem DATETIME použijte následující syntaxi SQL:

CREATE TABLE sample_table (
    event_time DATETIME
);

V tomto příkladu je v tabulce sample_table vytvořen sloupec DATETIME s názvem event_time.

3.2 Vkládání hodnot DATETIME

Hodnoty MySQL DATETIME lze vkládat v různých formátech. Základní formát je 'YYYY-MM-DD HH:MM:SS'. Například:

INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');

Povolené jsou také následující formáty:

  • 'YY-MM-DD HH:MM:SS' – formát používající dvouciferný rok.
  • 'YYYYMMDDHHMMSS' – formát bez oddělovačů.

Příklad:

INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);

Data vložená v těchto formátech budou uložena správně. Pokud je rok zadán dvouciferně, '70-99' se převede na 1970-1999 a '00-69' na 2000-2069.

3.3 Načítání hodnot DATETIME

Při načítání hodnot DATETIME MySQL je zobrazí ve výchozím formátu 'YYYY-MM-DD HH:MM:SS'. Například:

SELECT event_time FROM sample_table;

Tento dotaz zobrazí hodnoty ve sloupci DATETIME pomocí standardního formátu.

4. Práce se zlomkovými sekundami

4.1 Přesnost DATETIME

V MySQL mohou hodnoty DATETIME obsahovat zlomkové sekundy. Přesnost lze specifikovat pomocí volby fsp, která umožňuje ukládat zlomkové sekundy od 0 do 6 číslic. Například pro vytvoření sloupce se 3 číslicemi zlomkových sekund:

CREATE TABLE precise_times (
    event_time DATETIME(3)
);

V tomto příkladu může sloupec event_time ukládat zlomkové sekundy až do 3 číslic.

4.2 Vkládání hodnot se zlomkovými sekundami

Pro vložení hodnoty DATETIME, která zahrnuje zlomkové sekundy, použijte následující:

INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');

.Tento dotaz ukládá hodnotu včetně zlomkových sekund přesně. Zlomková část je uložena bez oříznutí a přesnost je zachována při načítání hodnoty.

5. Nejlepší postupy pro DATETIME

5.1 Výběr mezi DATETIME a TIMESTAMP

  • Kdy použít DATETIME : Pro pevné datum/časové hodnoty, které nezávisí na časových pásmech (například časy zahájení událostí nebo data rezervací).
  • Kdy použít TIMESTAMP : Pro datum/časová data související s časovým pásmem serveru (například časové razítka vytvoření nebo aktualizace záznamu).

5.2 Správa časových pásem

Protože DATETIME neukládá informaci o časovém pásmu, vaše aplikace musí časová pásma spravovat samostatně. Naopak TIMESTAMP automaticky zohledňuje časové pásmo serveru při ukládání i načítání hodnot, což jej činí vhodným pro systémy fungující napříč různými časovými pásmy po celém světě.

6. Časté chyby a jak se jim vyhnout

6.1 Nulová data a neplatné hodnoty

V MySQL, pokud se pokusíte vložit neplatnou hodnotu DATETIME, může být uloženo nulové datum jako '0000-00-00 00:00:00'. Protože se jedná obecně o neplatné datum, měli byste validovat vstupní data, aby se zabránilo vložení neplatných hodnot. Implementace validace, která zajistí, že vstup odpovídá správnému rozsahu a formátu, může pomoci předejít uložení nulových dat.

6.2 Nesprávné používání přesnosti

Při specifikaci přesnosti zlomkových sekund může nesprávná volba přesnosti vést k neočekávaným výsledkům. Zapisujte zlomkovou přesnost jen tehdy, když je to nutné, a hodnotu fsp vybírejte opatrně. Například pokud vaše aplikace nevyžaduje podsekundovou přesnost, není potřeba přidávat zlomkové sekundy do sloupce DATETIME.

7. Shrnutí

V tomto článku jsme podrobně vysvětlili typ DATETIME v MySQL. DATETIME je velmi užitečný datový typ pro ukládání jak data, tak času a je vhodný, když potřebujete hodnoty, které by neměly být ovlivněny časovými pásmy. Porozuměním rozdílům mezi DATETIME a TIMESTAMP, fungování časových pásem a používání zlomkových sekund můžete efektivněji spravovat datum/časová data ve své databázi. Navíc znalost častých chyb a způsobů, jak se jim vyhnout, pomáhá udržovat konzistenci a spolehlivost dat.

8. Často kladené otázky (FAQ)

Q1: Jaký je hlavní rozdíl mezi DATETIME a TIMESTAMP?

DATETIME ukládá pevné datum a čas, které nezávisí na časových pásmech. Například je vhodný pro ukládání dat rezervací nebo časů událostí, které by měly zůstat stejné v jakémkoli časovém pásmu. Naopak TIMESTAMP je uložen v UTC a při načtení je převeden na časové pásmo serveru. Je vhodný pro datum/časová data, která závisí na časovém pásmu serveru, jako jsou logy.

Q2: Jak mohu uložit zlomkové sekundy s DATETIME?

Můžete nastavit přesnost zlomkových sekund zadáním hodnoty fsp při vytváření sloupce DATETIME. Například DATETIME(3) ukládá zlomkové sekundy až na 3 číslice. Použijte správně naformátovanou hodnotu včetně zlomkových sekund při vkládání a bude uložena správně.

Q3: Mám použít DATETIME nebo TIMESTAMP?

Záleží na vašem konkrétním případu použití. Použijte DATETIME, pokud chcete uložit pevné datum a čas. Použijte TIMESTAMP pro datum/časová data, která jsou ovlivněna časovým pásmem serveru, například časy vytvoření nebo aktualizace záznamu. Protože TIMESTAMP provádí automatickou konverzi časových pásem, je vhodný, když váš systém musí fungovat napříč různými časovými pásmy.