MySQL-Datumsvergleich und -Manipulation: Komplettanleitung mit Beispielen & Performance‑Tipps

1. Einführung

Der Umgang mit Datumsangaben in MySQL ist einer der wichtigsten Aspekte von Datenbankoperationen. Beispielsweise wird beim Aggregieren von Verkaufsdaten nach Datum oder beim Suchen von Datensätzen innerhalb eines bestimmten Zeitraums ein Datumsvergleich unerlässlich.

Dieser Artikel erklärt alles von den Grundlagen der Datumsmanipulation und des Datumsvergleichs in MySQL bis hin zu fortgeschrittenen Anwendungsfällen und Techniken zur Leistungsoptimierung. Er ist darauf ausgelegt, Nutzern aller Erfahrungsstufen, von Anfängern bis zu fortgeschrittenen Entwicklern, nützlich zu sein.

2. Überblick über MySQL-Datentypen für Datum

Arten von Datum-Datentypen und ihre Eigenschaften

MySQL stellt die folgenden drei Haupt-Datentypen für Datum bereit. Nachfolgend finden Sie eine kurze Erklärung zu jedem.

  1. DATE
  • Gespeicherter Wert: Jahr-Monat-Tag ( YYYY-MM-DD )
  • Eigenschaften: Enthält keine Zeitinformationen, wodurch er sich für die Verwaltung einfacher Daten eignet.
  • Anwendungsfälle: Geburtstage, Fristen.
  1. DATETIME
  • Gespeicherter Wert: Jahr-Monat-Tag und Zeit ( YYYY-MM-DD HH:MM:SS )
  • Eigenschaften: Enthält Zeitinformationen, wodurch er sich für die Aufzeichnung präziser Zeitstempel eignet.
  • Anwendungsfälle: Erstellungszeitstempel, zuletzt aktualisierte Zeitstempel.
  1. TIMESTAMP
  • Gespeicherter Wert: Jahr-Monat-Tag und Zeit ( YYYY-MM-DD HH:MM:SS )
  • Eigenschaften: Zeitzonenabhängig, wodurch er nützlich ist, um Datum und Zeit über verschiedene Regionen hinweg zu verwalten.
  • Anwendungsfälle: Protokolldaten, Transaktionsaufzeichnungen.

Wie man den geeigneten Datentyp auswählt

  • Wenn keine Zeitangabe erforderlich ist, wählen Sie DATE.
  • Wenn eine Zeitangabe erforderlich ist, wählen Sie DATETIME oder TIMESTAMP, abhängig von den Zeitzonenanforderungen Ihrer Anwendung.

Beispielabfrage

Nachfolgend ein Beispiel, das jeden Datentyp verwendet.

CREATE TABLE events (
    event_id INT AUTO_INCREMENT PRIMARY KEY,
    event_date DATE,
    event_datetime DATETIME,
    event_timestamp TIMESTAMP
);

3. Wie man Daten vergleicht

Verwendung grundlegender Vergleichsoperatoren

In MySQL werden die folgenden Operatoren für den Datumsvergleich verwendet.

  1. = (Gleich)
  • Ruft Datensätze ab, die dem angegebenen Datum entsprechen.
    SELECT * FROM events WHERE event_date = '2025-01-01';
    
  1. > / < (Größer als / Kleiner als)
  • Sucht nach Datensätzen vor oder nach dem angegebenen Datum.
    SELECT * FROM events WHERE event_date > '2025-01-01';
    
  1. <= / >= (Kleiner oder gleich / Größer oder gleich)
  • Durchsucht einen Bereich, der das angegebene Datum einschließt.
    SELECT * FROM events WHERE event_date <= '2025-01-10';
    

Bereichsabfragen mit BETWEEN

Der BETWEEN-Operator ermöglicht es Ihnen, einfach einen Datumsbereich anzugeben.

SELECT * FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';

Wichtiger Hinweis:

  • BETWEEN schließt sowohl den Start- als auch den Endwert ein, stellen Sie also sicher, dass keine erforderlichen Daten unbeabsichtigt aus Ihrem Bereich ausgeschlossen werden.

4. Berechnung von Datumsdifferenzen

Verwendung der DATEDIFF-Funktion

Die Funktion DATEDIFF() berechnet die Differenz (in Tagen) zwischen zwei Daten.

SELECT DATEDIFF('2025-01-10', '2025-01-01') AS days_difference;

Ergebnis:

  • 9 Tage

Verwendung der TIMESTAMPDIFF-Funktion

Die Funktion TIMESTAMPDIFF() ermöglicht es Ihnen, die Differenz in bestimmten Einheiten wie Jahren, Monaten, Tagen oder Stunden zu berechnen.

SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-12-31') AS months_difference;

Ergebnis:

  • 11 Monate

5. Datum hinzufügen und subtrahieren

Datumsmanipulation mit der INTERVAL-Klausel

In MySQL können Sie mithilfe der INTERVAL-Klausel einfach Zeit zu einem Datum hinzufügen oder davon subtrahieren. Dies ermöglicht es Ihnen, Abfragen zu erstellen, die Daten vor oder nach einem bestimmten Zeitraum abrufen.

Hinzufügen zu einem Datum

Beispiel für das Hinzufügen von Zeit zu einem Datum mit INTERVAL:

SELECT DATE_ADD('2025-01-01', INTERVAL 7 DAY) AS plus_seven_days;

Ergebnis:
2025-01-08

Subtrahieren von einem Datum

Sie können Zeit von einem Datum auf ähnliche Weise mit INTERVAL subtrahieren:

SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH) AS minus_one_month;

Ergebnis:
2024-12-01

Anwendungsfall: Erinnerungssystem

Unten finden Sie ein Beispiel‑Query, das Ereignisse abruft, die genau vor sieben Tagen stattgefunden haben und das für das Versenden automatischer Erinnerung‑Benachrichtigungen verwendet werden kann.

SELECT event_name, event_date 
FROM events 
WHERE event_date = DATE_SUB(CURDATE(), INTERVAL 7 DAY);

Berechnungen basierend auf dem aktuellen Datum

  • CURDATE() : Gibt das aktuelle Datum zurück (YYYY‑MM‑DD).
  • NOW() : Gibt das aktuelle Datum und die aktuelle Uhrzeit zurück (YYYY‑MM‑DD HH:MM:SS).

Beispiel: Berechnen Sie das Datum eine Woche ab heute.

SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;

6. Praktische Abfragebeispiele

Datensätze für ein bestimmtes Datum abrufen

Rufen Sie Ereignisse ab, die dem angegebenen Datum entsprechen.

SELECT * 
FROM events 
WHERE event_date = '2025-01-01';

Daten innerhalb eines Datumsbereichs abrufen

Beispiel für die Suche nach Ereignissen innerhalb eines einwöchigen Bereichs.

SELECT * 
FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07';

Daten nach Datum aggregieren

Dieses Query zählt, wie viele Ereignisse für jeden Monat registriert sind.

SELECT MONTH(event_date) AS event_month, COUNT(*) AS total_events 
FROM events 
GROUP BY MONTH(event_date);

Beispiel‑Ergebnis:

event_monthtotal_events
110
215

7. Leistungsoptimierung

Effiziente Suche mit Indizes

Das Setzen eines Indexes auf einer Datumsspalte kann die Abfrageleistung erheblich verbessern.

Erstellen eines Index

Das folgende SQL erstellt einen Index auf der Spalte event_date.

CREATE INDEX idx_event_date ON events(event_date);

Überprüfen der Wirkung eines Indexes

Sie können EXPLAIN verwenden, um den Ausführungsplan der Abfrage zu prüfen.

EXPLAIN SELECT * 
FROM events 
WHERE event_date = '2025-01-01';

Wichtige Hinweise bei der Verwendung von Funktionen

Die Verwendung von Funktionen in der WHERE‑Klausel kann die Indexnutzung deaktivieren.

Schlechtes Beispiel

Im folgenden Query verhindert die Funktion DATE(), dass der Index verwendet wird.

SELECT * 
FROM events 
WHERE DATE(event_date) = '2025-01-01';

Verbessertes Beispiel

Es wird empfohlen, Werte direkt zu vergleichen, ohne Funktionen zu verwenden.

SELECT * 
FROM events 
WHERE event_date >= '2025-01-01' 
  AND event_date < '2025-01-02';

8. FAQ (Häufig gestellte Fragen)

Q1: Was ist der Unterschied zwischen DATE und DATETIME?

  • A1:
  • DATE: Speichert nur das Datum (YYYY-MM-DD). Verwenden Sie es, wenn Zeitinformationen nicht benötigt werden.
  • DATETIME: Speichert sowohl Datum als auch Uhrzeit (YYYY-MM-DD HH:MM:SS). Verwenden Sie es, wenn der genaue Zeitstempel eines Ereignisses benötigt wird.

Beispiel:

CREATE TABLE examples (
    example_date DATE,
    example_datetime DATETIME
);

Q2: Worauf sollte ich achten, wenn ich einen Datumsbereich mit BETWEEN angebe?

  • A2:
  • Da BETWEEN sowohl das Start- als auch das Enddatum einschließt, kann es vorkommen, dass Sie nicht alle gewünschten Datensätze erhalten, wenn das Enddatum keinen Zeitwert enthält.

Beispiel:

-- This query may not retrieve records such as "2025-01-31 23:59:59"
SELECT * 
FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';

Verbesserung:
Setzen Sie die Endzeit explizit auf 23:59:59 oder verwenden Sie einen Vergleich, der den Zeitanteil ignoriert.

SELECT * 
FROM events 
WHERE event_date >= '2025-01-01' AND event_date < '2025-02-01';

Q3: Wie sollten Zeitzonendifferenzen behandelt werden?

  • A3: In MySQL ist der Typ TIMESTAMP zeitzonenabhängig. Im Gegensatz dazu speichert der Typ DATETIME einen festen Wert und ist nicht von Zeitzonen betroffen.

Aktuelle Zeitzoneneinstellung prüfen:

SHOW VARIABLES LIKE 'time_zone';

Zeitzoneneinstellung ändern:

SET time_zone = '+09:00'; -- Japan Standard Time (JST)

Q4: Wie kann ich Daten der letzten 30 Tage abrufen?

  • A4: Sie können CURDATE() oder NOW() mit INTERVAL kombinieren, um Daten der letzten 30 Tage abzurufen.

Beispiel:

SELECT * 
FROM events 
WHERE event_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

Q5: Wie kann ich die Performance von Datumsvergleichen verbessern?

  • A5:
  • Indizes erstellen: Setzen Sie einen Index auf Datumsspalten.
  • Vermeiden Sie die Verwendung von Funktionen: Die Verwendung von Funktionen in der WHERE-Klausel kann Indizes deaktivieren, daher sollten Sie direkte Vergleiche verwenden.

9. Zusammenfassung

Schlüsselpunkte dieses Artikels

Dieser Artikel bietet eine umfassende Erklärung der Datumsmanipulations- und Vergleichstechniken in MySQL. Die wichtigsten Erkenntnisse sind wie folgt:

  1. Verständnis der Eigenschaften und korrekten Verwendung von Datumstypen (DATE, DATETIME, TIMESTAMP).
  2. Grundlegende Vergleichsmethoden ( = , > , < , BETWEEN , usw.).
  3. Berechnung von Datumsdifferenzen ( DATEDIFF() , TIMESTAMPDIFF() ).
  4. Verbesserung der Performance durch Indexierung und optimales Abfragedesign.

Wir hoffen, dass Ihnen dieser Leitfaden hilft, Datumsoperationen in MySQL effizient zu handhaben und praktische, optimierte Abfragen für reale Anwendungsfälle zu entwickeln.