SQL – Daten nach Tagesdatum abfragen. Wenn keine Daten fehlen, geben Sie 0 zurück. Es muss keine Tabelle erstellt werden. Wenn keine Daten für den Tag vorhanden sind, wird ein Wert zurückgegeben. Diagramm Daten nach Tag abfragen und zurückgeben


Der Umgebungshintergrund dieses Blogs: JAVA-Projekt und MySQL-Datenbank. Es muss in der Lage sein, den Datenwert des Tages entsprechend dem Tagesdatum zurückzugeben. Wenn an diesem Tag keine Daten vorhanden sind, sollte 0 zurückgegeben werden. Andernfalls kommt es zu Problemen wie fehlenden Tagesdaten und nicht übereinstimmenden Werten.

Ich habe viele Implementierungslösungen gesehen, die direkt einen Stundenplan in der Datenbank erstellen, die Datumsdaten speichern und dann gemeinsame Abfragen durchführen. Zu diesem Zeitpunkt hatte ich das Gefühl, dass es etwas zu umständlich war, eine weitere Tabelle zu erstellen und dann alle vorherigen Inhalte zu ändern. Dann stellte ich fest, dass ich eine virtuelle Zeittabelle erstellen und die gemeinsame SQL-Abfrage direkt ändern konnte, aber am Ende fand ich es dass es immer noch recht umständlich war. . Wählen Sie einfach eine davon aus und implementieren Sie sie.

1. SQL erstellt eine virtuelle Datumstabelle

Verwenden Sie direkt die folgende Anweisung, um eine virtuelle Datumstabelle zu erstellen, die aus der benötigten Geschäftstabelle (Tabelle1) abgerufen werden kann.

SELECT
  @cdate: = date_add(@cdate, interval - 1 day) as date_str
FROM(SELECT @cdate: = date_add(CURDATE(), interval + 1 day) from table1) t1

2. Die Geschäftslogikabfrage muss mit dem Datumsalias der Datumstabellenabfrage konsistent sein.

create_date ist eine logische Abfrage basierend auf dem Erstellungsdatum. Sie DATE_FORMAT()kann die Zeit im Format „JJJJ-MM-TT HH:MM:SS“ in das erforderliche Datumsformat „JJJJ-MM-TT“ konvertieren.
Das Datum ist nur ein Beispiel für einen Abfragestil und kann tatsächlich durch die erforderliche Start- und Endzeit ersetzt werden.

SELECT DATE_FORMAT(a.create_date, '%Y-%m-%d') as date_str, count(*) as date_count FROM table1 as a WHERE a.create_date>="2022-05-10 00:00:00" and a.create_date<"2022-09-13 23:59:00" 
    GROUP BY DATE_FORMAT(a.create_date, '%Y-%m-%d')

3. Zwei Abfragen werden gemeinsam mittels Left-Joins abgefragt.

Sie müssen einen Left-Join verwenden, um die logische Abfrage mit der virtuellen Datumstabelle zu verbinden. date_str ist das Datumsfeld, date_count ist das erforderliche statistische Datenfeld.
Date ist nur ein Beispiel für einen Abfragestil. Es kann tatsächlich durch die erforderliche startTime und endTime ersetzt werden. Gleichzeitig ist es notwendig, den Rückgabedatumsbereich einzuschränken und hinzuzufügen Die gleiche Abfragefrist gilt für den äußersten Teil. Die eigentliche Abfrage lautet wie folgt: Bei Bedarf sollte auch der äußerste Where-Block mithilfe der Anpassung konvertiert werden. DATE_FORMAT()Schließlich ist
bei ORDER BY date_str ASC standardmäßig aufsteigend und DESC standardmäßig absteigend sortiert.

SELECT t1.date_str, COALESCE(t2.date_count, 0) as date_count
FROM(
    SELECT @cdate:=date_add(@cdate, interval - 1 day) as date_str FROM(SELECT @cdate:=date_add(CURDATE(), interval + 1 day) from task) tmp1
) t1
LEFT JOIN(
    SELECT DATE_FORMAT(a.create_date, '%Y-%m-%d') as date_str, count(*) as date_count FROM table1 as a WHERE a.create_date>="2022-05-10 00:00:00" and a.create_date<"2022-09-13 23:59:00" 
    GROUP BY DATE_FORMAT(a.create_date, '%Y-%m-%d') 
) t2
on t1.date_str = t2.date_str
WHERE t1.date_str>="2022-05-10" AND t1.date_str<="2022-09-13"
ORDER BY t1.date_str ASC

Implementierungsmethode mithilfe einer Kalendertabelle: https://blog.csdn.net/smilecall/article/details/78319242
Ich habe viele Möglichkeiten gefunden, eine Kalendertabelle direkt zu erstellen, habe es aber noch nicht ausprobiert. Ich habe auch eine Adresse angegeben, die geeigneter erscheint .

Referenz: https://www.ancii.com/ankwpdeau/

Guess you like

Origin blog.csdn.net/weixin_44436677/article/details/127939651