- 1 1. Úvod
- 2 2. Jak získat aktuální čas v MySQL
- 3 3. Jak formátovat aktuální čas v MySQL
- 4 4. Výpočty data/času pomocí aktuálního času v MySQL
- 5 5. Nastavení časové zóny v MySQL
- 6 6. Jak nastavit aktuální čas jako výchozí hodnotu v MySQL
- 7 7. Časté chyby MySQL a řešení (FAQ)
- 8 8. Nejlepší postupy pro práci s aktuálním časem v MySQL
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_TIMESTAMPatd.) - 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ě.
| Function | Returns | Example |
|---|---|---|
NOW() | Current date and time (date + time) | SELECT NOW(); → 2025-02-11 16:00:00 |
CURRENT_TIMESTAMP | Same as NOW() (SQL standard) | SELECT CURRENT_TIMESTAMP; |
CURDATE() | Current date only | SELECT CURDATE(); → 2025-02-11 |
CURTIME() | Current time only | SELECT 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?
| Purpose | Recommended Function |
|---|---|
| Retrieve both date and time | NOW() or CURRENT_TIMESTAMP |
| Retrieve date only | CURDATE() |
| Retrieve time only | CURTIME() |
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
| Specifier | Meaning | Example (2025-02-11 16:45:30) |
|---|---|---|
%Y | 4-digit year | 2025 |
%m | 2-digit month (01-12) | 02 |
%d | 2-digit day (01-31) | 11 |
%H | Hour (00-23, 24-hour format) | 16 |
%i | Minutes (00-59) | 45 |
%s | Seconds (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.
| Function | Returns | SQL | Output Example (2025-02-11 16:45:30) |
|---|---|---|---|
YEAR() | Year | SELECT YEAR(NOW()); | 2025 |
MONTH() | Month | SELECT MONTH(NOW()); | 2 |
DAY() | Day | SELECT 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
| Unit | Meaning | Example |
|---|---|---|
| SECOND | Seconds | NOW() + INTERVAL 10 SECOND |
| MINUTE | Minutes | NOW() + INTERVAL 5 MINUTE |
| HOUR | Hours | NOW() + INTERVAL 2 HOUR |
| DAY | Days | NOW() + INTERVAL 10 DAY |
| MONTH | Months | NOW() + 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
| Type | Affected by Time Zone | Can Set CURRENT_TIMESTAMP as Default |
|---|---|---|
TIMESTAMP | Yes | Yes |
DATETIME | No | No |
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 Case | Recommended |
|---|---|
Retrieve the current time in a SELECT statement | NOW() |
Automatically set the current time during INSERT | CURRENT_TIMESTAMP |
Set as the default value of a TIMESTAMP column | CURRENT_TIMESTAMP |
Kdy použít TIMESTAMP vs DATETIME
| Data Type | Affected by Time Zone | Storage Size |
|---|---|---|
TIMESTAMP | Yes | 4 bytes |
DATETIME | No | 8 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;


