Auf der Suche nach Ereignissen der letzten 30 Tage
Eine weitere häufige Aufgabe ist die Suche nach Zeilen, die zu einem bestimmten Datumsbereich gehören. Im Prinzip ist das nicht schwierig, wenn das Start- und Enddatum des Bereichs feststeht: SQL kann Datumsangaben genauso gut vergleichen wie Zahlen.
Vergleichsoperatoren können auf Datumsangaben angewendet werden: < , > , <= usw. Darüber hinaus gibt es einen speziellen BETWEEN-Operator, der auch mit Datumsangaben arbeiten kann. Schreiben wir zum Beispiel eine Abfrage, die alle Aufgaben aus der Aufgabentabelle auswählt, die im Sommer 2022 erledigt werden müssen. Die Anfrage sieht folgendermaßen aus:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Das Ergebnis dieser Abfrage wird sein:
Ausweis | emploee_id | Name | Termin |
---|---|---|---|
1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 |
2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 |
3 | 5 | Kaffee kaufen | 01.07.2022 |
4 | 5 | Kaffee kaufen | 01.08.2022 |
Aber was soll man in die Anfrage schreiben, wenn wir beispielsweise Aufgaben für die letzten 30 Tage erhalten möchten? Wobei die letzten 30 Tage direkt mit der Ausführungszeit der Abfrage verknüpft sind. Das heißt, wenn die Abfrage am 25. Juli ausgeführt wird, müssen Sie Daten vom 25. Juni bis 24. Juli auswählen. Wie binde ich einen Datumsbereich an die aktuelle Uhrzeit?
Verwenden Sie dazu die Datumsadditionsfunktion:
DATE_ADD (date, INTERVAL expression units)
Ich denke, es wird einfacher sein, es anhand einiger Beispiele zu erklären:
# | Anfrage | Ergebnis |
---|---|---|
1 | DATE_ADD('2022-06-04', INTERVALL 5 TAGE) | 09.06.2022 |
2 | DATE_ADD('2022-06-04', INTERVALL 4 WOCHEN) | 02.07.2022 |
3 | DATE_ADD('2022-06-04', INTERVALL 2 MONATE) | 04.08.2022 |
4 | ||
5 | DATE_SUB('2022-06-04', INTERVALL 5 TAGE) | 30.05.2022 |
6 | DATE_SUB('2022-06-04', INTERVALL 4 WOCHEN) | 07.05.2022 |
7 | DATE_SUB('2022-06-04', INTERVALL 2 MONATE) | 04.04.2022 |
Von einem bestimmten Datum kann übrigens auch eine bestimmte Anzahl an Tagen, Wochen, Monaten und Jahren abgezogen werden.
Und wenn wir zu unserer Anfrage zurückkehren – um Daten für die letzten 30 Tage zu erhalten, dann benötigen wir zwei Daten in diesem Bereich:
- CURDATE() – Ende des Bereichs
- DATE_SUB( CURDATE() , INTERVAL 30 DAY) – Beginn des Bereichs
Die Anfrage sieht folgendermaßen aus:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Das Ergebnis dieser Abfrage wird so aussehen (ich habe heute den 4. Juni 2022):
Ausweis | emploee_id | Name | Termin |
---|---|---|---|
1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 |
So ermitteln Sie den Unterschied zwischen zwei Daten
Und noch eine nützliche Funktion. Manchmal müssen Sie möglicherweise die Differenz zwischen zwei Daten in Tagen berechnen. Zu diesem Zweck verfügt SQL über eine spezielle Funktion – DATEDIFF().
Die Zusammenarbeit mit ihr ist ganz einfach:
DATEDIFF (date 1, date 2)
Das zweite Datum wird einfach vom ersten Datum abgezogen. Wenn Datum2 nach Datum1 liegt, ist das Ergebnis negativ.
Übrigens können wir unsere vorherige Abfrage mit der Funktion DATEDIFF() umschreiben. Wir müssen alle Aufgaben aus der Aufgabentabelle auswählen, deren Frist vom aktuellen Datum um nicht mehr als 30 Tage abweicht. So würde diese Anfrage aussehen:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
Das Ergebnis dieser Abfrage wird so aussehen (ich habe heute den 4. Juni 2022):
Ausweis | emploee_id | Name | Termin |
---|---|---|---|
1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 |
2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 |
3 | 5 | Kaffee kaufen | 01.07.2022 |
Diesmal hat SQL bis zu drei Zeilen gefunden. Überlegen Sie, warum es beim letzten Mal eine Zeile gab und dieses Mal drei?