Heim >Datenbank >MySQL-Tutorial >Wie füllt man Datumslücken in MySQL-Abfragen?

Wie füllt man Datumslücken in MySQL-Abfragen?

Susan Sarandon
Susan SarandonOriginal
2024-12-24 21:37:45139Durchsuche

How to Fill Date Gaps in MySQL Queries?

Datumslücken in MySQL füllen

Bei der Arbeit mit datumsbasierten Abfragen in MySQL kann es vorkommen, dass es Lücken in den Daten gibt für bestimmte Termine. Dies kann problematisch sein, wenn Sie eine umfassende Ansicht der Daten präsentieren oder Berechnungen durchführen möchten, die auf einem vollständigen Satz von Daten basieren.

Abfrage mit Datumslücken:

Um das Problem zu veranschaulichen, betrachten Sie die folgende Abfrage:

SELECT DATE(posted_at) AS date,
    COUNT(*) AS total,
    SUM(attitude = 'positive') AS positive,
    SUM(attitude = 'neutral') AS neutral,
    SUM(attitude = 'negative') AS negative
    FROM `messages`
    WHERE (`messages`.brand_id = 1)
    AND (`messages`.`spam` = 0
    AND `messages`.`duplicate` = 0
    AND `messages`.`ignore` = 0)
    GROUP BY date ORDER BY date

Diese Abfrage gibt die nach Datum gruppierten Ergebnisse zurück und zeigt die Gesamtzahl und Einstellungssummen für jedes Datum an. Wenn es jedoch Daten ohne Daten gibt, werden diese nicht in die Ergebnisse einbezogen, was zu Lücken im Datensatz führt.

Lücken füllen:

Zum Füllen Wenn wir diese Lücken mit Nullen versehen, können wir eine Hilfstabelle verwenden, um einen vollständigen Satz von Datumsangaben zwischen einem Start- und einem Enddatum zu generieren. Die Hilfstabelle kann mit der folgenden Abfrage erstellt werden:

SELECT date AS dt FROM (
    SELECT CURDATE() AS date
    UNION ALL
    SELECT date + INTERVAL 1 DAY FROM dates
    FROM dates
    WHERE date < DATE_ADD(CURDATE(), INTERVAL 1 YEAR)
) dates

Diese Abfrage fügt rekursiv einen Tag zum aktuellen Datum hinzu, bis es ein Jahr in der Zukunft erreicht.

Abfrage mit Hilfstabelle:

Jetzt können wir die Hilfstabelle mit unserer Hauptabfrage verknüpfen, indem wir einen LEFT JOIN verwenden, um das Datum zu füllen Lücken:

SELECT  d.dt AS date,
        COUNT(*) AS total,
        SUM(attitude = 'positive') AS positive,
        SUM(attitude = 'neutral') AS neutral,
        SUM(attitude = 'negative') AS negative
FROM    dates d
LEFT JOIN
        messages m
ON      m.posted_at >= d.dt
        AND m.posted_at < d.dt + INTERVAL 1 DAYS
        AND spam = 0
        AND duplicate = 0
        AND ignore = 0
GROUP BY
        d.dt
ORDER BY
        d.dt

Diese Abfrage gibt einen vollständigen Satz von Datumsangaben zurück, einschließlich derjenigen ohne Daten, und füllt die Lücken mit Nullen.

Das obige ist der detaillierte Inhalt vonWie füllt man Datumslücken in MySQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn