Ser etter hendelser de siste 30 dagene
En annen vanlig oppgave er å søke etter rader som tilhører en bestemt datoperiode. I prinsippet er dette ikke vanskelig hvis start- og sluttdatoene for området er faste: SQL kan sammenligne datoer like godt som tall.
Sammenligningsoperatorer kan brukes på datoer: < , > , <= , osv. I tillegg er det en spesiell MELLOM-operator som også kan jobbe med datoer. La oss for eksempel skrive en spørring som vil velge alle oppgaver fra oppgavetabellen som må gjøres sommeren 2022. Forespørselen vil se slik ut:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Resultatet av denne spørringen vil være:
id | emploee_id | Navn | frist |
---|---|---|---|
1 | 1 | Rett opp en feil på frontend | 2022-06-01 |
2 | 2 | Rett opp en feil på backend | 2022-06-15 |
3 | 5 | Kjøp kaffe | 2022-07-01 |
4 | 5 | Kjøp kaffe | 2022-08-01 |
Men hva skal vi skrive i forespørselen hvis vi ønsker å få oppgaver, for eksempel for de siste 30 dagene. Der de siste 30 dagene er direkte knyttet til utførelsestiden for spørringen. Det vil si at hvis spørringen utføres 25. juli, må du velge datoer fra 25. juni til 24. juli. Hvordan binde en datoperiode til gjeldende klokkeslett?
For å gjøre dette, bruk datotilleggsfunksjonen:
DATE_ADD (date, INTERVAL expression units)
Jeg tror det vil være lettere å forklare med noen eksempler:
# | Be om | Resultat |
---|---|---|
1 | DATE_ADD('2022-06-04', INTERVAL 5 DAG) | 2022-06-09 |
2 | DATE_ADD('2022-06-04', INTERVAL 4 UKER) | 2022-07-02 |
3 | DATE_ADD('2022-06-04', INTERVAL 2 MÅNED) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04', INTERVAL 5 DAG) | 2022-05-30 |
6 | DATE_SUB('2022-06-04', INTERVAL 4 UKER) | 2022-05-07 |
7 | DATE_SUB('2022-06-04', INTERVAL 2 MÅNED) | 2022-04-04 |
Forresten, et visst antall dager, uker, måneder og år kan også trekkes fra en bestemt dato.
Og hvis vi går tilbake til forespørselen vår - for å få data for de siste 30 dagene, trenger vi to datoer i dette området:
- CURDATE() - slutten av området
- DATE_SUB( CURDATE() , INTERVAL 30 DAY) - start på området
Forespørselen vil se slik ut:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Resultatet av denne spørringen vil være slik (jeg har i dag 4. juni 2022):
id | emploee_id | Navn | frist |
---|---|---|---|
1 | 1 | Rett opp en feil på frontend | 2022-06-01 |
Hvordan finne forskjellen mellom to datoer
Og en annen nyttig funksjon. Noen ganger må du kanskje beregne forskjellen mellom to datoer i dager. For å gjøre dette har SQL en spesiell funksjon - DATEDIFF ().
Det er veldig enkelt å jobbe med henne:
DATEDIFF (date 1, date 2)
Den andre datoen trekkes ganske enkelt fra den første datoen. Hvis dato2 kommer etter dato1, vil resultatet være negativt.
Forresten, vi kan skrive om vår forrige spørring ved å bruke DATEDIFF()-funksjonen. Vi må velge alle oppgaver fra oppgavetabellen hvis frist avviker fra gjeldende dato med ikke mer enn 30 dager. Slik vil forespørselen se ut:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
Resultatet av denne spørringen vil være slik (jeg har i dag 4. juni 2022):
id | emploee_id | Navn | frist |
---|---|---|---|
1 | 1 | Rett opp en feil på frontend | 2022-06-01 |
2 | 2 | Rett opp en feil på backend | 2022-06-15 |
3 | 5 | Kjøp kaffe | 2022-07-01 |
Denne gangen fant SQL så mange som tre rader. Tenk på hvorfor sist gang var det én linje, og denne gangen er det tre?