Az elmúlt 30 nap eseményeit keresi

Egy másik gyakori feladat egy adott dátumtartományhoz tartozó sorok keresése. Ez elvileg nem nehéz, ha a tartomány kezdő és záró dátuma rögzített: az SQL ugyanúgy képes összehasonlítani a dátumokat, mint a számokat.

Összehasonlító operátorok alkalmazhatók a dátumokra: < , > , <= stb. Ezen kívül létezik egy speciális BETWEEN operátor, amely dátumokkal is tud dolgozni. Például írjunk egy lekérdezést, amely kijelöli a feladattáblából az összes olyan feladatot, amelyet 2022 nyarán el kell végezni. A kérés így fog kinézni:

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

A lekérdezés eredménye a következő lesz:

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 5 Vegyél kávét 2022-07-01
4 5 Vegyél kávét 2022-08-01

De mit írjunk a kérésbe, ha például az elmúlt 30 napra szeretnénk feladatokat kapni. Ahol az elmúlt 30 nap közvetlenül a lekérdezés végrehajtási idejéhez van kötve. Vagyis ha a lekérdezés végrehajtása július 25-én történik, akkor június 25-től július 24-ig kell dátumot választani. Hogyan lehet dátumtartományt az aktuális időhöz kötni?

Ehhez használja a dátum-összeadás funkciót:

DATE_ADD (date, INTERVAL expression units)

Azt hiszem, néhány példával könnyebb lesz elmagyarázni:

# Kérés Eredmény
1 DATE_ADD('2022-06-04', INTERVALLUM 5 NAP) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVALLUM 4 HÉT) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVALLUM 2 HÓNAP) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVALLUM 5 NAP) 2022-05-30
6 DATE_SUB('2022-06-04', INTERVALLUM 4 HÉT) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVAL 2 HÓNAP) 2022-04-04

Egyébként egy bizonyos dátumból bizonyos számú nap, hét, hónap és év is levonható.

És ha visszatérünk a kérésünkhöz - az elmúlt 30 nap adatainak lekéréséhez, akkor ebben a tartományban két dátumra van szükségünk:

  • CURDATE() - a tartomány vége
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - a tartomány kezdete

A kérés így fog kinézni:

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

A lekérdezés eredménye a következő lesz (ma van, 2022. június 4.):

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01

Hogyan lehet megtalálni a különbséget két dátum között

És még egy hasznos funkció. Néha előfordulhat, hogy ki kell számítania két dátum közötti különbséget napokban. Ehhez az SQL-nek van egy speciális funkciója - DATEDIFF ().

Nagyon könnyű vele dolgozni:

DATEDIFF (date 1, date 2)

A második dátumot egyszerűen levonják az első randevúból. Ha a dátum2 a dátum1 után jön, akkor az eredmény negatív lesz.

Az előző lekérdezésünket egyébként a DATEDIFF() függvény segítségével átírhatjuk. A feladattáblázatból ki kell választanunk minden olyan feladatot, amelynek határideje legfeljebb 30 nappal tér el az aktuális dátumtól. Így nézne ki a kérés:

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

A lekérdezés eredménye a következő lesz (ma van, 2022. június 4.):

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 5 Vegyél kávét 2022-07-01

Ezúttal az SQL három sort talált. Gondolj bele, miért volt legutóbb egy sor, most pedig három?