Caut evenimente din ultimele 30 de zile

O altă sarcină comună este căutarea rândurilor care aparțin unui anumit interval de date. În principiu, acest lucru nu este dificil dacă datele de început și de sfârșit ale intervalului sunt fixe: SQL poate compara datele la fel de bine ca și numerele.

Operatorii de comparație pot fi aplicați pentru date: < , > , <= , etc. În plus, există un operator special BETWEEN care poate lucra și cu date. De exemplu, să scriem o interogare care va selecta toate sarcinile din tabelul de sarcini care trebuie făcute în vara anului 2022. Cererea va arăta astfel:

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

Rezultatul acestei interogări va fi:

id Emploee_id Nume Termen limită
1 1 Remediați o eroare pe front-end 2022-06-01
2 2 Remediați o eroare pe backend 2022-06-15
3 5 Cumpără cafea 2022-07-01
4 5 Cumpără cafea 2022-08-01

Dar ce să scriem în cerere dacă vrem să obținem sarcini, de exemplu, pentru ultimele 30 de zile. În cazul în care ultimele 30 de zile sunt direct legate de timpul de execuție a interogării. Adică, dacă interogarea este executată pe 25 iulie, atunci trebuie să selectați date între 25 iunie și 24 iulie. Cum se leagă un interval de date la ora curentă?

Pentru a face acest lucru, utilizați funcția de adăugare a datei:

DATE_ADD (date, INTERVAL expression units)

Cred că va fi mai ușor de explicat cu câteva exemple:

# Cerere Rezultat
1 DATE_ADD('2022-06-04', INTERVAL 5 DAY) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVAL 4 WEEK) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVAL 2 MONTH) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVAL 5 DAY) 30-05-2022
6 DATE_SUB('2022-06-04', INTERVAL 4 WEEK) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVAL 2 MONTH) 2022-04-04

Apropo, dintr-o anumită dată se poate scădea și un anumit număr de zile, săptămâni, luni și ani.

Și dacă revenim la solicitarea noastră - pentru a obține date pentru ultimele 30 de zile, atunci avem nevoie de două date în acest interval:

  • CURDATE() - sfârșitul intervalului
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - începutul intervalului

Cererea va arăta astfel:

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

Rezultatul acestei interogări va fi astfel (am astăzi 4 iunie 2022):

id Emploee_id Nume Termen limită
1 1 Remediați o eroare pe front-end 2022-06-01

Cum să găsești diferența dintre două întâlniri

Și o altă caracteristică utilă. Uneori poate fi necesar să calculați diferența dintre două date în zile. Pentru a face acest lucru, SQL are o funcție specială - DATEDIFF ().

Este foarte ușor să lucrezi cu ea:

DATEDIFF (date 1, date 2)

A doua dată este pur și simplu scăzută din prima dată. Dacă data2 vine după data1, atunci rezultatul va fi negativ.

Apropo, putem rescrie interogarea anterioară folosind funcția DATEDIFF(). Trebuie să selectăm toate sarcinile din tabelul de sarcini al căror termen limită diferă de data curentă cu cel mult 30 de zile. Iată cum ar arăta această solicitare:

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

Rezultatul acestei interogări va fi astfel (am astăzi 4 iunie 2022):

id Emploee_id Nume Termen limită
1 1 Remediați o eroare pe front-end 2022-06-01
2 2 Remediați o eroare pe backend 2022-06-15
3 5 Cumpără cafea 2022-07-01

De data aceasta, SQL a găsit până la trei rânduri. Gândiți-vă de ce data trecută a fost o singură linie și de data aceasta sunt trei?