Naghahanap ng mga kaganapan sa nakalipas na 30 araw

Ang isa pang karaniwang gawain ay ang paghahanap ng mga row na kabilang sa isang partikular na hanay ng petsa. Sa prinsipyo, hindi ito mahirap kung ang mga petsa ng pagsisimula at pagtatapos ng hanay ay naayos: Maaaring ihambing ng SQL ang mga petsa pati na rin ang mga numero.

Maaaring ilapat ang mga operator ng paghahambing sa mga petsa: < , > , <= , atbp. Bilang karagdagan, mayroong isang espesyal na BETWEEN operator na maaari ding gumana sa mga petsa. Halimbawa, magsulat tayo ng query na pipili ng lahat ng gawain mula sa talahanayan ng gawain na kailangang gawin sa tag-araw ng 2022. Ang kahilingan ay magiging ganito:

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

Ang magiging resulta ng query na ito ay:

id emploee_id pangalan deadline
1 1 Ayusin ang isang bug sa frontend 2022-06-01
2 2 Ayusin ang isang bug sa backend 2022-06-15
3 5 Bumili ng kape 2022-07-01
4 5 Bumili ng kape 2022-08-01

Ngunit ano ang isusulat sa kahilingan kung gusto naming makakuha ng mga gawain, halimbawa, sa huling 30 araw. Kung saan ang huling 30 araw ay direktang nakatali sa oras ng pagpapatupad ng query. Iyon ay, kung ang query ay naisakatuparan sa Hulyo 25, pagkatapos ay kailangan mong pumili ng mga petsa mula Hunyo 25 hanggang Hulyo 24. Paano magbigkis ng hanay ng petsa sa kasalukuyang oras?

Upang gawin ito, gamitin ang function ng pagdaragdag ng petsa:

DATE_ADD (date, INTERVAL expression units)

Sa tingin ko magiging mas madaling ipaliwanag gamit ang ilang mga halimbawa:

# Hiling Resulta
1 DATE_ADD('2022-06-04', INTERVAL 5 DAY) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVAL 4 LINGGO) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVAL 2 BUWAN) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVAL 5 DAY) 2022-05-30
6 DATE_SUB('2022-06-04', INTERVAL 4 LINGGO) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVAL 2 BUWAN) 2022-04-04

Sa pamamagitan ng paraan, ang isang tiyak na bilang ng mga araw, linggo, buwan at taon ay maaari ding ibawas sa isang tiyak na petsa.

At kung babalik kami sa aming kahilingan - upang makakuha ng data para sa huling 30 araw, kailangan namin ng dalawang petsa sa hanay na ito:

  • CURDATE() - dulo ng saklaw
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - simula ng range

Ang kahilingan ay magiging ganito:

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

Magiging ganito ang resulta ng query na ito (Meron ako ngayon June 4, 2022):

id emploee_id pangalan deadline
1 1 Ayusin ang isang bug sa frontend 2022-06-01

Paano mahahanap ang pagkakaiba sa pagitan ng dalawang petsa

At isa pang kapaki-pakinabang na tampok. Minsan maaaring kailanganin mong kalkulahin ang pagkakaiba sa pagitan ng dalawang petsa sa mga araw. Upang gawin ito, ang SQL ay may isang espesyal na function - DATEDIFF ().

Napakadaling makipagtulungan sa kanya:

DATEDIFF (date 1, date 2)

Ang pangalawang petsa ay ibinabawas lamang sa unang petsa. Kung dumating ang date2 pagkatapos ng date1, magiging negatibo ang resulta.

Sa pamamagitan ng paraan, maaari naming muling isulat ang aming nakaraang query gamit ang DATEDIFF() function. Kailangan nating piliin ang lahat ng mga gawain mula sa talahanayan ng gawain na ang deadline ay naiiba sa kasalukuyang petsa nang hindi hihigit sa 30 araw. Narito ang magiging hitsura ng kahilingang iyon:

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

Magiging ganito ang resulta ng query na ito (Meron ako ngayon June 4, 2022):

id emploee_id pangalan deadline
1 1 Ayusin ang isang bug sa frontend 2022-06-01
2 2 Ayusin ang isang bug sa backend 2022-06-15
3 5 Bumili ng kape 2022-07-01

Sa pagkakataong ito, nakahanap ang SQL ng kasing dami ng tatlong row. Isipin kung bakit noong huling pagkakataon ay may isang linya, at sa pagkakataong ito ay tatlo na?