Letar efter händelser under de senaste 30 dagarna

En annan vanlig uppgift är att söka efter rader som tillhör ett specifikt datumintervall. I princip är detta inte svårt om intervallets start- och slutdatum är fasta: SQL kan jämföra datum lika bra som siffror.

Jämförelseoperatorer kan tillämpas på datum: < , > , <= , etc. Dessutom finns det en speciell MELLAN-operator som också kan arbeta med datum. Låt oss till exempel skriva en fråga som kommer att välja alla uppgifter från uppgiftstabellen som behöver göras sommaren 2022. Förfrågan kommer att se ut så här:

SELECT * FROM task  
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

Resultatet av denna fråga blir:

id emploee_id namn deadline
1 1 Fixa en bugg på frontend 2022-06-01
2 2 Fixa en bugg på backend 2022-06-15
3 5 Köp kaffe 2022-07-01
4 5 Köp kaffe 2022-08-01

Men vad ska man skriva i förfrågan om vi vill få uppgifter för till exempel de senaste 30 dagarna. Där de senaste 30 dagarna är direkt knutna till exekveringstiden för frågan. Det vill säga, om frågan exekveras den 25 juli måste du välja datum från 25 juni till 24 juli. Hur binder man ett datumintervall till den aktuella tiden?

För att göra detta, använd datumtilläggsfunktionen:

DATE_ADD (date, INTERVAL expression units)

Jag tror att det blir lättare att förklara med några exempel:

# Begäran Resultat
1 DATE_ADD('2022-06-04', INTERVAL 5 DAG) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVAL 4 VECKOR) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVAL 2 MÅNADER) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVAL 5 DAG) 2022-05-30
6 DATE_SUB('2022-06-04', INTERVAL 4 VECKOR) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVAL 2 MÅNADER) 2022-04-04

Förresten, ett visst antal dagar, veckor, månader och år kan också subtraheras från ett visst datum.

Och om vi återgår till vår begäran - för att få data för de senaste 30 dagarna, behöver vi två datum inom detta intervall:

  • CURDATE() - slutet av intervallet
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - start av intervall

Förfrågan kommer att se ut så här:

SELECT * FROM task WHERE task.deadline  
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

Resultatet av den här frågan kommer att bli så här (jag har idag 4 juni 2022):

id emploee_id namn deadline
1 1 Fixa en bugg på frontend 2022-06-01

Hur man hittar skillnaden mellan två datum

Och en annan användbar funktion. Ibland kan du behöva beräkna skillnaden mellan två datum i dagar. För att göra detta har SQL en speciell funktion - DATEDIFF ().

Det är väldigt lätt att arbeta med henne:

DATEDIFF (date 1, date 2)

Det andra datumet subtraheras helt enkelt från det första datumet. Om datum2 kommer efter datum1 blir resultatet negativt.

Förresten, vi kan skriva om vår tidigare fråga med hjälp av DATEDIFF()-funktionen. Vi måste välja alla uppgifter från uppgiftstabellen vars deadline avviker från det aktuella datumet med högst 30 dagar. Så här skulle begäran se ut:

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30

Resultatet av den här frågan kommer att bli så här (jag har idag 4 juni 2022):

id emploee_id namn deadline
1 1 Fixa en bugg på frontend 2022-06-01
2 2 Fixa en bugg på backend 2022-06-15
3 5 Köp kaffe 2022-07-01

Den här gången hittade SQL så många som tre rader. Tänk på varför förra gången var det en rad, och den här gången är det tre?