Průvodce aktuálním časem v MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, nastavení časových pásem a osvědčené postupy

目次

1. Úvod

Kdy potřebujete pracovat s aktuálním časem v MySQL?

V MySQL je získání aktuálního času vyžadováno v mnoha různých scénářích. Například následující případy použití jsou běžné:

  • Automatické vkládání časové značky při registraci dat
  • Například zaznamenání data a času vytvoření při ukládání objednávkových dat nebo logovacích dat.
  • Filtrování dat na základě aktuálního času
  • Například získání pouze dat z posledních 7 dní nebo hledání záznamů s budoucími daty.
  • Formátování dat a časů pro zobrazení
  • Formátování hodnot data a času pro lepší čitelnost při generování reportů.
  • Správa vypršení platnosti dat pomocí aktuálního času
  • Například určení, zda je kupón stále platný porovnáním s aktuálním časem.

Jak vidíte, správné získávání a manipulace s aktuálním časem v MySQL je důležitou dovedností v správě databází.

Co se v tomto článku naučíte

Tento článek podrobně vysvětluje následující témata:

  • Jak získat aktuální čas v MySQL (NOW(), CURRENT_TIMESTAMP atd.)
  • Jak změnit formáty data a času (pomocí DATE_FORMAT())
  • Výpočty data a času pomocí aktuálního času (pomocí INTERVAL)
  • Jak změnit časové pásmo (SET SESSION time_zone)
  • Použití aktuálního času jako výchozí hodnoty (CURRENT_TIMESTAMP)
  • Časté chyby a jak je opravit (FAQ)

Od základů po pokročilé použití práce s „aktuálním časem“ v MySQL, tento průvodce poskytuje praktické SQL příklady. Určitě si přečtěte až do konce.

2. Jak získat aktuální čas v MySQL

Seznam funkcí pro získání aktuálního času v MySQL

MySQL poskytuje několik funkcí pro získání aktuálního času. Pochopte rozdíly a používejte je vhodně.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

Funkce NOW()

NOW() je nejčastěji používaná funkce v MySQL pro získání aktuálního času.
Vrací jak datum, tak čas.

SELECT NOW();

Příklad výstupu:

2025-02-11 16:00:00
  • NOW() vrací aktuální systémový čas.
  • Protože je ovlivněna časovým pásmem, zobrazený čas se může lišit v závislosti na vašem prostředí (podrobně vysvětleno v sekci „Nastavení časového pásma“).

Jak použít CURRENT_TIMESTAMP

CURRENT_TIMESTAMP se chová téměř stejně jako NOW(). Dodržuje SQL standard a může být také použita v jiných databázích.

SELECT CURRENT_TIMESTAMP;

Příklad výstupu:

2025-02-11 16:00:00

Získání pouze data pomocí CURDATE()

CURDATE() se používá, když chcete získat pouze aktuální datum (rok, měsíc, den).

SELECT CURDATE();

Příklad výstupu:

2025-02-11

Získání pouze času pomocí CURTIME()

Pokud chcete získat pouze aktuální čas (hodina, minuta, sekunda), použijte CURTIME().

SELECT CURTIME();

Příklad výstupu:

16:00:00

Kterou funkci byste měli použít?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

3. Jak formátovat aktuální čas v MySQL

Vlastní formátování pomocí DATE_FORMAT()

Základní syntaxe DATE_FORMAT()

V MySQL můžete použít funkci DATE_FORMAT(), abyste libovolně změnili formát dat a časů.

SELECT DATE_FORMAT(datetime_value, 'format_specifiers');

Příklad: Převést NOW() do formátu YYYY/MM/DD HH:MM

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');

Výstup:

2025/02/11 16:45

Seznam běžných specifikátorů formátu

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (00-59)30

Extrahování pouze časové části pomocí TIME()

Pokud chcete extrahovat pouze časovou část z datetime vráceného funkcí NOW(), použijte funkci TIME().

SELECT TIME(NOW());

Výstup:

16:45:30

Extrahování částí pomocí YEAR(), MONTH() a DAY()

Pro extrahování konkrétních částí použijte následující funkce.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT DAY(NOW());11

Praktické příklady formátování

The following SQL is useful for trying various formats in practice.

SELECT 
    NOW() AS 'Original datetime',
    DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
    DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
    TIME(NOW()) AS 'Time only',
    YEAR(NOW()) AS 'Year',
    MONTH(NOW()) AS 'Month',
    DAY(NOW()) AS 'Day';

4. Výpočty data/času pomocí aktuálního času v MySQL

Přidání/Odečtení pomocí INTERVAL

Základní syntaxe

SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;

Přidání času na základě NOW()

For example, to retrieve the datetime “one week later”:

SELECT NOW() + INTERVAL 7 DAY;

Příklad výstupu:

2025-02-18 16:30:00
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + INTERVAL 3 MONTH

Vypočítat rozdíl mezi dvěma daty pomocí DATEDIFF()

SELECT DATEDIFF(NOW(), '2025-01-01');

Příklad výstupu:

30

Filtrování podle časového intervalu pomocí BETWEEN

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

5. Nastavení časové zóny v MySQL

Zkontrolovat aktuální časovou zónu

SHOW VARIABLES LIKE '%time_zone%';

Příklad výstupu:

+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| system_time_zone | UTC            |
| time_zone        | SYSTEM         |
+------------------+----------------+

Změna časové zóny pro relaci

SET SESSION time_zone = 'Asia/Tokyo';

Změna výchozí časové zóny serveru

Add the following to the configuration file (my.cnf):

[mysqld]
default_time_zone = 'Asia/Tokyo'

Získání UTC času pomocí UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Převod na místní čas pomocí CONVERT_TZ()

SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');

6. Jak nastavit aktuální čas jako výchozí hodnotu v MySQL

Nastavit CURRENT_TIMESTAMP jako výchozí hodnotu

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Automatické aktualizace pomocí ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Rozdíl mezi DATETIME a TIMESTAMP

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

Proč nelze použít NOW() jako výchozí hodnotu a řešení

ERROR 1067 (42000): Invalid default value for 'created_at'

Řešení:

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

7. Časté chyby MySQL a řešení (FAQ)

Nelze použít NOW() jako výchozí hodnotu

Příklad chyby

CREATE TABLE logs (
    created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'

Řešení

CREATE TABLE logs (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Čas CURRENT_TIMESTAMP je nesprávný

SHOW VARIABLES LIKE 'time_zone';

Řešení

SET SESSION time_zone = 'Asia/Tokyo';

Výsledek NOW() je posunut o jednu hodinu

SHOW VARIABLES LIKE 'system_time_zone';

Řešení

SET GLOBAL time_zone = 'Asia/Tokyo';

Filtrování rozsahu pomocí BETWEEN nefunguje podle očekávání

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';

Řešení

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

8. Nejlepší postupy pro práci s aktuálním časem v MySQL

Kdy použít NOW() vs CURRENT_TIMESTAMP

Use CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Kdy použít TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 bytes

Ukládat v UTC a převádět na místní čas

SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');

Použijte >= a < místo BETWEEN

SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00' 
AND created_at < '2025-03-01 00:00:00';

Standardizujte používání INTERVAL

SELECT NOW() + INTERVAL 1 DAY;

Správně vyčistěte stará data

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;