Op zoek naar gebeurtenissen in de afgelopen 30 dagen
Een andere veel voorkomende taak is het zoeken naar rijen die bij een bepaald datumbereik horen. In principe is dit niet moeilijk als de begin- en einddatum van de reeks vastligt: SQL kan net zo goed datums als getallen vergelijken.
Vergelijkingsoperatoren kunnen worden toegepast op datums: < , > , <= , enz. Daarnaast is er een speciale TUSSEN-operator die ook met datums kan werken. Laten we bijvoorbeeld een query schrijven die alle taken uit de takentabel selecteert die in de zomer van 2022 moeten worden uitgevoerd. Het verzoek ziet er als volgt uit:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Het resultaat van deze query zal zijn:
ID kaart | medewerker_id | naam | deadline |
---|---|---|---|
1 | 1 | Los een bug op de frontend op | 01-06-2022 |
2 | 2 | Los een bug op de backend op | 2022-06-15 |
3 | 5 | Koop koffie | 01-07-2022 |
4 | 5 | Koop koffie | 01-08-2022 |
Maar wat te schrijven in het verzoek als we bijvoorbeeld taken willen krijgen voor de afgelopen 30 dagen. Waarbij de laatste 30 dagen direct gekoppeld zijn aan de uitvoeringstijd van de query. Dat wil zeggen, als de query wordt uitgevoerd op 25 juli, moet u datums selecteren van 25 juni tot 24 juli. Hoe een datumbereik binden aan de huidige tijd?
Gebruik hiervoor de functie voor het toevoegen van datums:
DATE_ADD (date, INTERVAL expression units)
Ik denk dat het makkelijker zal zijn om het uit te leggen met een paar voorbeelden:
# | Verzoek | Resultaat |
---|---|---|
1 | DATE_ADD('2022-06-04', INTERVAL 5 DAG) | 09-06-2022 |
2 | DATE_ADD('2022-06-04', INTERVAL 4 WEEK) | 2022-07-02 |
3 | DATE_ADD('2022-06-04', INTERVAL 2 MAAND) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04', INTERVAL 5 DAG) | 2022-05-30 |
6 | DATE_SUB('2022-06-04', INTERVAL 4 WEEK) | 07-05-2022 |
7 | DATE_SUB('2022-06-04', INTERVAL 2 MAAND) | 2022-04-04 |
Van een bepaalde datum kan overigens ook een bepaald aantal dagen, weken, maanden en jaren worden afgetrokken.
En als we terugkeren naar ons verzoek - om gegevens van de afgelopen 30 dagen te krijgen, dan hebben we twee datums in dit bereik nodig:
- CURDATE() - einde bereik
- DATE_SUB( CURDATE() , INTERVAL 30 DAG) - begin van bereik
Het verzoek ziet er als volgt uit:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Het resultaat van deze vraag zal als volgt zijn (ik heb vandaag 4 juni 2022):
ID kaart | medewerker_id | naam | deadline |
---|---|---|---|
1 | 1 | Los een bug op de frontend op | 01-06-2022 |
Hoe het verschil tussen twee datums te vinden
En nog een handige functie. Soms moet u het verschil tussen twee datums in dagen berekenen. Om dit te doen, heeft SQL een speciale functie - DATEDIFF ().
Het is heel gemakkelijk om met haar samen te werken:
DATEDIFF (date 1, date 2)
De tweede datum wordt gewoon afgetrokken van de eerste datum. Als datum2 na datum1 komt, is het resultaat negatief.
Overigens kunnen we onze vorige query herschrijven met de functie DATEDIFF(). We moeten alle taken uit de takentabel selecteren waarvan de deadline niet meer dan 30 dagen verschilt van de huidige datum. Dit is hoe dat verzoek eruit zou zien:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
Het resultaat van deze vraag zal als volgt zijn (ik heb vandaag 4 juni 2022):
ID kaart | medewerker_id | naam | deadline |
---|---|---|---|
1 | 1 | Los een bug op de frontend op | 01-06-2022 |
2 | 2 | Los een bug op de backend op | 2022-06-15 |
3 | 5 | Koop koffie | 01-07-2022 |
Deze keer vond SQL maar liefst drie rijen. Bedenk eens waarom de vorige keer er één regel was, en deze keer zijn het er drie?
GO TO FULL VERSION