MySQL aktuelle Zeit: NOW(), CURDATE(), UTC_TIMESTAMP(), Zeitzonen und bewährte Vorgehensweisen

目次

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() und CURRENT_TIMESTAMP geben 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 DATE verwendet 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

PurposeSQL
Current date and timeSELECT NOW();
Get UTCSELECT UTC_TIMESTAMP();
Date onlySELECT CURDATE();
Time onlySELECT CURTIME();
Get millisecondsSELECT 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

MySQL DATETIME と TIMESTAMP の違いを示した図。TIMESTAMPはUTC変換され、DATETIMEは変換されない。

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_TIMESTAMP verwendet.

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 festgelegt
  • SYSDATE() → 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?

FunctionBehaviorRecommended use
NOW()Fixed within a queryLogging, consistency-focused
SYSDATE()Call-time valuePrecise 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
  1. 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 Funktion DATE_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

SpezifikatorBedeutungBeispiel
%YJahr (4 Stellen)2025
%mMonat (2 Stellen)02
%dTag (2 Stellen)01
%HStunde (24‑Stunden‑Format)15
%hStunde (12‑Stunden‑Format)03
%iMinute30
%sSekunde45
%pAM/PMPM

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

ZweckFunktion
Anzeigeformat ändernDATE_FORMAT
Nur Zeit formatierenTIME_FORMAT
String → datetime konvertierenSTR_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

EinheitBedeutung
SECONDSekunden
MINUTEMinuten
HOURStunden
DAYTage
MONTHMonate
YEARJahre

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

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
MONTHMonths
YEARYears

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