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?
GO TO FULL VERSION