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