- 1 1. Aktuelle Zeit in MySQL abrufen (Fazit: Kürzestes SQL‑Cheat Sheet)
- 1.1 1.1 MySQL aktuelles Datum und Uhrzeit: NOW() / CURRENT_TIMESTAMP
- 1.2 1.2 MySQL aktuelles Datum: CURDATE()
- 1.3 1.3 MySQL aktuelle Uhrzeit: CURTIME()
- 1.4 1.4 MySQL aktuelle UTC‑Zeit: UTC_TIMESTAMP()
- 1.5 1.5 MySQL aktuelle Zeit mit Millisekunden: NOW(3) / CURRENT_TIMESTAMP(3)
- 1.6 1.6 Schnelles Cheat Sheet nach Zweck
- 1.7 Zusammenfassung häufiger Stolperfallen
- 2 2. Unterschiede zwischen MySQL NOW() und CURRENT_TIMESTAMP
- 2.1 2.1 Welche sollten Sie verwenden? (Verwendung in SELECT / Verwendung als DEFAULT)
- 2.2 2.2 Korrekte Verwendung von DEFAULT / ON UPDATE
- 2.3 2.3 Unterschiede zwischen NOW() und SYSDATE() (Wichtig)
- 2.4 2.4 Welche sollte man verwenden?
- 2.5 2.5 Häufige Missverständnisse und Probleme
- 2.6 2.6 Praktische Best Practices
- 2.7 3.1 MySQL‑Datum‑Zeit‑Formatierung: DATE_FORMAT(NOW(), …)
- 2.8 3.2 Umwandlung in japanisches oder 12‑Stunden‑Format
- 2.9 3.3 MySQL‑Nur‑Zeit‑Formatierung: TIME_FORMAT()
- 2.10 3.4 String → datetime‑Umwandlung: STR_TO_DATE()
- 2.11 3.5 Wichtige Punkte im Produktivbetrieb
- 2.12 3.6 Formatierung mit Millisekunden
- 2.13 3.7 Zusammenfassung nach Formatierungszweck
- 3 4. MySQL‑Datum‑ und Zeit‑Addition/Subtraktion (DATE_ADD / DATE_SUB)
- 4 5. Berechnung von Datums‑/Zeitdifferenzen in MySQL (DATEDIFF / TIMESTAMPDIFF)
- 5 6. Datumsbereichsabfragen mit aktueller Zeit
1. Aktuelle Zeit in MySQL abrufen (Fazit: Kürzestes SQL‑Cheat Sheet)
Wenn Sie die aktuelle Zeit in MySQL erhalten möchten, gibt es nur wenige SQL‑Funktionen, die Sie sich merken müssen.
Unten finden Sie die kürzeste Antwort für das Suchkeyword „MySQL get current time“.
1.1 MySQL aktuelles Datum und Uhrzeit: NOW() / CURRENT_TIMESTAMP
Gibt das aktuelle Datum + Uhrzeit (YYYY‑MM‑DD HH:MM:SS) zurück.
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
Beispielausgabe
2025-02-01 15:30:45
NOW()undCURRENT_TIMESTAMPgeben normalerweise das gleiche Ergebnis zurück.- Beide geben das aktuelle Datum und die aktuelle Uhrzeit zurück.
- Wenn Sie Millisekunden benötigen, verwenden Sie das Folgende.
SELECT NOW(3);
Hinweise (häufige Fehler)
- Hängt von der Zeitzoneneinstellung des Servers ab.
- In einer UTC‑Umgebung erhalten Sie möglicherweise UTC statt japanischer Zeit.
- Während der Abfrageausführung gibt sie im Wesentlichen dieselbe Zeit zurück (innerhalb einer einzelnen Anweisung fest).
1.2 MySQL aktuelles Datum: CURDATE()
Gibt nur das Datum zurück (keine Uhrzeit).
SELECT CURDATE();
Beispielausgabe
2025-02-01
Anwendungsfälle
- Daten von heute abfragen
- Datumsvergleiche (z. B. nur die heutigen Datensätze filtern)
Hinweise
- Der Rückgabewert ist vom Typ
DATE. - Nicht geeignet, wenn Sie eine Verarbeitung der Tageszeit benötigen.
1.3 MySQL aktuelle Uhrzeit: CURTIME()
Gibt nur die Uhrzeit zurück.
SELECT CURTIME();
Beispielausgabe
15:30:45
Anwendungsfälle
- Prüfung der Geschäftszeiten
- Verzweigungslogik nach Zeitfenster
Hinweise
- Enthält keine Datumsinformation.
- Kann nicht zum Vergleich mit Spalten vom Typ
DATEverwendet werden.
1.4 MySQL aktuelle UTC‑Zeit: UTC_TIMESTAMP()
Gibt die Zeit in UTC (Coordinated Universal Time) zurück, unabhängig von der Zeitzoneneinstellung des Servers.
SELECT UTC_TIMESTAMP();
Beispielausgabe
2025-02-01 06:30:45
Wann Sie es verwenden sollten
- Globale Dienste
- Designs, die Protokolle konsequent in UTC speichern
Häufige Fehler
- Die Kombination mit
NOW()führt zu Zeitverschiebungen - Wenn die Anwendung JST annimmt, sehen Sie einen Unterschied von 9 Stunden
1.5 MySQL aktuelle Zeit mit Millisekunden: NOW(3) / CURRENT_TIMESTAMP(3)
MySQL 5.6 und neuer unterstützt Bruchteilssekunden.
SELECT NOW(3);
SELECT CURRENT_TIMESTAMP(3);
Beispielausgabe
2025-02-01 15:30:45.123
Hinweise zur Speicherung
Ihre Spalte muss ebenfalls Bruchteilssekunden unterstützen.
DATETIME(3)
TIMESTAMP(3)
Wenn Sie es in einer nicht unterstützten Spalte speichern, wird der Bruchteil abgeschnitten.
1.6 Schnelles Cheat Sheet nach Zweck
| Purpose | SQL |
|---|---|
| Current date and time | SELECT NOW(); |
| Get UTC | SELECT UTC_TIMESTAMP(); |
| Date only | SELECT CURDATE(); |
| Time only | SELECT CURTIME(); |
| Get milliseconds | SELECT NOW(3); |
Zusammenfassung häufiger Stolperfallen
- Die Zeit ist verschoben, weil Sie die Zeitzone nicht überprüft haben
- Verwendung von
NOW(3)ohne eine Millisekunden‑fähige Spalte - Vermischung von UTC und lokaler Zeit
- Das Unterschied zwischen DATETIME und TIMESTAMP nicht verstehen

Unterschied zwischen MySQL DATETIME und TIMESTAMP (Vergleich, ob eine Zeitzonenkonvertierung erfolgt)
2. Unterschiede zwischen MySQL NOW() und CURRENT_TIMESTAMP
NOW() und CURRENT_TIMESTAMP sehen ähnlich aus, aber ein Missverständnis darüber, wo man sie einsetzt und wie sie sich verhalten, kann leicht zu Bugs führen. Hier fassen wir die Unterschiede, die korrekte Verwendung und häufige Stolperfallen zusammen.
2.1 Welche sollten Sie verwenden? (Verwendung in SELECT / Verwendung als DEFAULT)
■ Beim Abrufen des aktuellen Datums/Uhrzeit in SELECT
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
Normalerweise geben beide das gleiche Ergebnis zurück.
- Sie sind gleichwertig (Synonyme)
- Der Rückgabewert entspricht
DATETIME - Wird von der Zeitzoneneinstellung beeinflusst
Praktische Erkenntnis
- Bevorzugen Sie Lesbarkeit →
NOW() - Bevorzugen Sie den Standard‑SQL‑Stil →
CURRENT_TIMESTAMP
■ Beim Festlegen eines Spalten‑Standardwerts
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Der entscheidende Punkt ist:
Für einen Standardwert wird üblicherweise
CURRENT_TIMESTAMPverwendet.
Einige Umgebungen erlauben ebenfalls NOW(), aber das Verhalten kann je nach MySQL-Version und SQL-Modus variieren. Die sicherere Wahl ist CURRENT_TIMESTAMP.
2.2 Korrekte Verwendung von DEFAULT / ON UPDATE
Wenn Sie einen „updated at“-Zeitstempel automatisch aktualisieren möchten:
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
);
Verhalten
- Bei INSERT → setzt die aktuelle Zeit für
created_at/updated_at - Bei UPDATE → aktualisiert nur
updated_at
Häufige Fehler
- Nicht übereinstimmende Bruchteilssekunden‑Präzision bei Verwendung von
DATETIME - Ältere MySQL‑Beschränkungen bei mehreren TIMESTAMP‑Spalten treffen (MySQL 5.6 und früher hatten Einschränkungen)
2.3 Unterschiede zwischen NOW() und SYSDATE() (Wichtig)
Der leicht zu übersehende Punkt ist der Unterschied zu SYSDATE().
SELECT NOW(), SYSDATE();
■ Verhaltensunterschiede
NOW()→ zum Zeitpunkt des Beginns der Abfrage festgelegtSYSDATE()→ gibt die Zeit zum Moment seiner Aufrufes zurück
Beispiel:
SELECT NOW(), SLEEP(3), NOW();
NOW() gibt denselben Wert zurück.
SELECT SYSDATE(), SLEEP(3), SYSDATE();
SYSDATE() zeigt eine 3‑Sekunden‑Differenz.
2.4 Welche sollte man verwenden?
| Function | Behavior | Recommended use |
|---|---|---|
| NOW() | Fixed within a query | Logging, consistency-focused |
| SYSDATE() | Call-time value | Precise real-time retrieval |
Warum NOW() oft in realen Systemen empfohlen wird
- Bewahrt Konsistenz innerhalb einer Transaktion (ein Mechanismus, der mehrere SQL‑Anweisungen zusammen verarbeitet)
- Sicherer in Replikationsumgebungen
2.5 Häufige Missverständnisse und Probleme
❌ „NOW() und CURRENT_TIMESTAMP sind exakt gleich, also muss man nicht darüber nachdenken.“
→ Unterschiede können sich in Standardwerten oder Aktualisierungsverhalten zeigen, je nach Umgebung.
❌ „SYSDATE() ist genauer, also ist es immer besser.“
→ Es kann in Replikationsumgebungen Probleme verursachen.
❌ Keine Überprüfung der Zeitzone
SHOW VARIABLES LIKE '%time_zone%';
Wenn Sie es ohne Überprüfung verwenden, können Zeitabweichungen entstehen.
2.6 Praktische Best Practices
- SELECT‑Abruf →
NOW() - Spalten‑Standardwert →
CURRENT_TIMESTAMP - Auto‑Update →
ON UPDATE CURRENT_TIMESTAMP - Auf Konsistenz ausgerichtet → Standard auf
NOW() - UTC‑basiertes Design →
TIMESTAMP+ in UTC speichern
- MySQL aktuelle Zeitformatierung (DATE_FORMAT / TIME_FORMAT)
Nachdem die aktuelle Zeit in MySQL abgerufen wurde, ist es sehr üblich, das Anzeigeformat zu ändern.
Für die Suchintention „MySQL current time format“ ist die wichtigste zu verstehende FunktionDATE_FORMAT().
3.1 MySQL‑Datum‑Zeit‑Formatierung: DATE_FORMAT(NOW(), …)
Grundsyntax:
sql
SELECT DATE_FORMAT(target_datetime, 'format_string');
Beispiel: Formatieren der aktuellen Zeit
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
Beispielausgabe
2025-02-01 15:30:45
Häufig verwendete Format‑Spezifikatoren
| Spezifikator | Bedeutung | Beispiel |
|---|---|---|
| %Y | Jahr (4 Stellen) | 2025 |
| %m | Monat (2 Stellen) | 02 |
| %d | Tag (2 Stellen) | 01 |
| %H | Stunde (24‑Stunden‑Format) | 15 |
| %h | Stunde (12‑Stunden‑Format) | 03 |
| %i | Minute | 30 |
| %s | Sekunde | 45 |
| %p | AM/PM | PM |
3.2 Umwandlung in japanisches oder 12‑Stunden‑Format
■ Japanisches Format
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
Beispielausgabe:
2025-02-01 15:30
■ 12‑Stunden‑Format + AM/PM
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');
Beispielausgabe:
2025-02-01 03:30:45 PM
3.3 MySQL‑Nur‑Zeit‑Formatierung: TIME_FORMAT()
Eine Formatierungsfunktion speziell für Daten des Typs TIME.
sql
SELECT TIME_FORMAT(CURTIME(), '%H:%i');
Beispielausgabe:
15:30
Hinweise
– TIME_FORMAT() gilt nur für den Typ TIME
– Für DATETIME verwenden Sie DATE_FORMAT()
3.4 String → datetime‑Umwandlung: STR_TO_DATE()
Um Zeichenketten in einen datetime‑Typ zu konvertieren:
sql
SELECT STR_TO_DATE('2025-02-01 15:30:45', '%Y-%m-%d %H:%i:%s');
Beispielausgabe:
2025-02-01 15:30:45
Häufige Fehler
– Format‑Mismatches führen zu NULL
– Verwechslung von %m und %c (null‑gepolsterter vs. nicht‑gepolsterter Monat)
3.5 Wichtige Punkte im Produktivbetrieb
❌ Nicht nach dem Formatieren vergleichen
Falsches Beispiel:
sql
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-01';
Dies ist nicht empfehlenswert, weil Indizes unwirksam werden (Abfrage‑Performance leidet).
Empfohlen:
sql
WHERE created_at >= '2025-02-01' AND created_at < '2025-02-02';
❌ Nicht zu stark auf der DB‑Seite formatieren
In Web‑Apps ist die Formatierung für die Anzeige meist flexibler auf der Anwendungsebene.
Die Datenbank sollte sich auf „Speicherung und Berechnung“ konzentrieren.
3.6 Formatierung mit Millisekunden
sql
SELECT DATE_FORMAT(NOW(3), '%Y-%m-%d %H:%i:%s.%f');
%f steht für Mikrosekunden (6 Stellen).
Hinweis
Ist die Spalte nicht DATETIME(3) oder ähnlich, wird der Bruchteil abgeschnitten.
Verfügbar ab MySQL 5.6 und neuer.
3.7 Zusammenfassung nach Formatierungszweck
| Zweck | Funktion |
|---|---|
| Anzeigeformat ändern | DATE_FORMAT |
| Nur Zeit formatieren | TIME_FORMAT |
| String → datetime konvertieren | STR_TO_DATE |
| Millisekunden anzeigen | %f |
4. MySQL‑Datum‑ und Zeit‑Addition/Subtraktion (DATE_ADD / DATE_SUB)
Selbst wenn Sie die aktuelle Zeit abrufen können, können Sie sie im Produktivbetrieb nicht effektiv nutzen, ohne Datums‑/Zeit‑Berechnungen wie „X Tage später“ oder „X Stunden zuvor“.
Im Folgenden wird erklärt, wie Sie DATE_ADD() und DATE_SUB() mit der aktuellen Zeit in MySQL verwenden.
4.1 MySQL‑Datum‑Zeit‑Addition: DATE_ADD()
Grundsyntax:
sql
SELECT DATE_ADD(base_datetime, INTERVAL value unit);
Beispiel: 7 Tage ab jetzt
sql
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
Beispiel: 2 Stunden später
sql
SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);
Häufig verwendete Einheiten
| Einheit | Bedeutung |
|---|---|
| SECOND | Sekunden |
| MINUTE | Minuten |
| HOUR | Stunden |
| DAY | Tage |
| MONTH | Monate |
| YEAR | Jahre |
4.2 MySQL‑Datum‑Zeit‑Subtraktion: DATE_SUB()
Grundsyntax:
sql
SELECT DATE_SUB(base_datetime, INTERVAL value unit);
Beispiel: vor 30 Tagen
sql
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
Beispiel: vor 1 Stunde
sql
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);
Anwendungsfälle
– Ablauf‑Prüfungen
– Löschen alter Log‑Einträge
– Extrahieren aktueller Daten
4.3 Häufige Muster im Produktivbetrieb
■ Daten der letzten 24 Stunden abrufen
sql
SELECT * FROM logs WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);
■ Frist 7 Tage später setzen
sql
INSERT INTO tasks (deadline) VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));
4.4 Häufige Fehler und Vorsichtsmaßnahmen
❌ Funktionen auf Spalten anwenden
Schlechtes Beispiel:
WHERE DATE(created_at) = CURDATE();
Dies deaktiviert Indizes (Optimierung der Abfrageleistung).
Empfohlen:
WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
❌ Zeitzonen ignorieren
NOW() basiert auf der Zeitzone des Servers
Wenn Sie in UTC speichern, verwenden Sie UTC_TIMESTAMP() als Basis
Beispiel:
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL 1 DAY);
❌ Fallstricke bei Monatsaddition
SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);
→ Aufgrund der Anpassung am Monatsende kann sich das Datum ändern.
(Das Ergebnis kann je nach Umgebung 2025-02-28 sein.)
Verstehen Sie die Spezifikation, bevor Sie monatsbasierte Berechnungen verwenden.
4.5 Addition mit Millisekunden
SELECT DATE_ADD(NOW(3), INTERVAL 500 MILLISECOND);
※ MySQL unterstützt MILLISECOND nicht direkt.
Geben Sie Mikrosekunden an:
SELECT DATE_ADD(NOW(3), INTERVAL 500000 MICROSECOND);
4.6 Best Practices
Standardisieren Sie NOW() oder UTC_TIMESTAMP() als Basis
Wenden Sie keine Funktionen auf Spalten in der WHERE‑Klausel an
Verstehen Sie das Verhalten von monatsbasierter Addition
Falls Präzision erforderlich ist, verwenden Sie DATETIME(3) oder höher
5. Berechnung von Datums‑/Zeitdifferenzen in MySQL (DATEDIFF / TIMESTAMPDIFF)
In Produktionssystemen reicht das bloße Abrufen der aktuellen Zeit nicht aus. Oft muss man wie viele Tage vergangen sind oder wie viele Stunden noch verbleiben berechnen.
5.1 Berechnung von Datumsdifferenzen: DATEDIFF()
DATEDIFF() berechnet die Differenz in Tagen zwischen zwei Daten.
SELECT DATEDIFF('2025-02-10', '2025-02-01');
Ergebnis
9
Wichtige Punkte
- Gibt nur die Differenz in Tagen zurück
- Der Zeitanteil wird ignoriert
- Das Ergebnis kann negativ sein
Beispiel: Tage seit Erstellung berechnen
SELECT DATEDIFF(NOW(), created_at)
FROM users;
5.2 Berechnung von Differenzen nach Einheit: TIMESTAMPDIFF()
TIMESTAMPDIFF() ermöglicht die Angabe der Einheit.
SELECT TIMESTAMPDIFF(unit, start_datetime, end_datetime);
Beispiel: Stundenunterschied
SELECT TIMESTAMPDIFF(HOUR, '2025-02-01 10:00:00', '2025-02-01 15:00:00');
Ergebnis
5
Übliche Einheiten
| Unit | Meaning |
|---|---|
| SECOND | Seconds |
| MINUTE | Minutes |
| HOUR | Hours |
| DAY | Days |
| MONTH | Months |
| YEAR | Years |
Beispiel: Minuten seit dem Login berechnen
SELECT TIMESTAMPDIFF(MINUTE, login_at, NOW())
FROM users;
5.3 Produktionsanwendungsfälle
- Prüfung von Sitzungs‑Timeouts
- Prüfung von Abonnementabläufen
- Berechnung der verstrichenen Zeit in Protokollen
- Logik zur Ratenbegrenzung
5.4 Häufige Fehler
❌ Verwendung von DATEDIFF, wenn Zeitpräzision erforderlich ist
DATEDIFF() ignoriert Stunden und Minuten.
❌ Umkehren der Argumentreihenfolge
Die Reihenfolge ist:
TIMESTAMPDIFF(unit, start, end)
Wenn umgekehrt, wird das Ergebnis negativ.
❌ Zeitzonen ignorieren
Wenn UTC und lokale Zeit gemischt werden, können die Differenzen inkorrekt sein.
5.5 Best Practices
- Verwenden Sie
TIMESTAMPDIFF(), wenn Zeitpräzision wichtig ist - Verwenden Sie
DATEDIFF()für einfache Tagesberechnungen - Stellen Sie eine konsistente Zeitzonennutzung sicher
- Standardisieren Sie UTC in verteilten Systemen
6. Datumsbereichsabfragen mit aktueller Zeit
Eine der häufigsten Anforderungen in der Praxis ist das Abrufen von Datensätzen innerhalb eines bestimmten Zeitraums, zum Beispiel:
- Heutige Datensätze
- Letzte 7 Tage
- Letzte 24 Stunden
- Dieser Monat
6.1 Abrufen der heutigen Datensätze (indexfreundlich)
SELECT *
FROM logs
WHERE created_at >= CURDATE()
AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
Warum das korrekt ist
- Keine Funktion wird auf die Spalte angewendet
- Indizes bleiben nutzbar
- Effiziente Bereichsabfrage
6.2 Letzte 7 Tage
SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);
6.3 Letzte 24 Stunden
SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);
6.4 Dieser Monat
SELECT *
FROM logs
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
AND created_at < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);
In Produktionssystemen ist es oft besser, Grenzen auf der Anwendungsseite zu berechnen und sie als Parameter zu übergeben.
6.5 Häufige Performance-Fehler
❌ Anwenden von Funktionen auf indizierte Spalten
WHERE DATE(created_at) = CURDATE();
Dies verhindert die Nutzung von Indizes und führt zu vollständigen Tabellenscans.
❌ Unachtsamer Einsatz von BETWEEN
BETWEEN ist inklusiv und kann zu Off-by-One-Sekunden-Problemen führen.
6.6 Zusammenfassung bewährter Praktiken
- Immer Bereichsbedingungen für die Datumsfilterung verwenden
- Vermeiden Sie das Anwenden von Funktionen auf indizierte Spalten
- Bevorzugen Sie die UTC-Speicherung in globalen Systemen
- Seien Sie eindeutig bezüglich Zeitzonenannahmen


