Alla ricerca di eventi negli ultimi 30 giorni

Un'altra attività comune è la ricerca di righe che appartengono a un intervallo di date specifico. In linea di principio, questo non è difficile se le date di inizio e fine dell'intervallo sono fisse: SQL può confrontare le date così come i numeri.

Gli operatori di confronto possono essere applicati alle date: < , > , <= , ecc. Inoltre, esiste uno speciale operatore BETWEEN che può funzionare anche con le date. Ad esempio, scriviamo una query che selezionerà tutte le attività dalla tabella delle attività che devono essere eseguite nell'estate del 2022. La richiesta sarà simile a questa:

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

Il risultato di questa query sarà:

id impiegato_id nome scadenza
1 1 Risolto un bug sul frontend 2022-06-01
2 2 Risolto un bug sul backend 2022-06-15
3 5 Compra il caffè 2022-07-01
4 5 Compra il caffè 2022-08-01

Ma cosa scrivere nella richiesta se vogliamo ottenere attività, ad esempio, negli ultimi 30 giorni. Dove gli ultimi 30 giorni sono direttamente legati al tempo di esecuzione della query. In altre parole, se la query viene eseguita il 25 luglio, è necessario selezionare le date dal 25 giugno al 24 luglio. Come associare un intervallo di date all'ora corrente?

Per fare ciò, utilizzare la funzione di aggiunta della data:

DATE_ADD (date, INTERVAL expression units)

Penso che sarà più facile spiegarlo con alcuni esempi:

# Richiesta Risultato
1 DATE_ADD('2022-06-04', INTERVALLO 5 GIORNI) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVALLO 4 SETTIMANA) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVALLO 2 MESE) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVALLO 5 GIORNI) 2022-05-30
6 DATE_SUB('2022-06-04', INTERVALLO 4 SETTIMANA) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVALLO 2 MESE) 2022-04-04

A proposito, da una certa data è anche possibile sottrarre un certo numero di giorni, settimane, mesi e anni.

E se torniamo alla nostra richiesta, per ottenere i dati degli ultimi 30 giorni, abbiamo bisogno di due date in questo intervallo:

  • CURDATE() - fine dell'intervallo
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - inizio dell'intervallo

La richiesta sarà simile a questa:

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

Il risultato di questa query sarà così (ho oggi 4 giugno 2022):

id impiegato_id nome scadenza
1 1 Risolto un bug sul frontend 2022-06-01

Come trovare la differenza tra due date

E un'altra caratteristica utile. A volte potrebbe essere necessario calcolare la differenza tra due date in giorni. Per fare ciò, SQL ha una funzione speciale: DATEDIFF ().

È molto facile lavorare con lei:

DATEDIFF (date 1, date 2)

La seconda data viene semplicemente sottratta dalla prima data. Se data2 viene dopo data1, il risultato sarà negativo.

A proposito, possiamo riscrivere la nostra query precedente usando la funzione DATEDIFF(). Dobbiamo selezionare tutte le attività dalla tabella delle attività la cui scadenza differisce dalla data corrente di non più di 30 giorni. Ecco come sarebbe la richiesta:

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

Il risultato di questa query sarà così (ho oggi 4 giugno 2022):

id impiegato_id nome scadenza
1 1 Risolto un bug sul frontend 2022-06-01
2 2 Risolto un bug sul backend 2022-06-15
3 5 Compra il caffè 2022-07-01

Questa volta, SQL ha trovato fino a tre righe. Pensa al motivo per cui l'ultima volta c'era una riga e questa volta ce ne sono tre?