Mencari acara dalam 30 hari yang lalu

Satu lagi tugas biasa ialah mencari baris yang tergolong dalam julat tarikh tertentu. Pada dasarnya, ini tidak sukar jika tarikh mula dan tamat julat ditetapkan: SQL boleh membandingkan tarikh dan juga nombor.

Operator perbandingan boleh digunakan pada tarikh: < , > , <= , dsb. Selain itu, terdapat operator ANTARA khas yang juga boleh berfungsi dengan tarikh. Sebagai contoh, mari tulis pertanyaan yang akan memilih semua tugasan daripada jadual tugasan yang perlu dilakukan pada musim panas 2022. Permintaan akan kelihatan seperti ini:

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

Hasil daripada pertanyaan ini ialah:

ID id_pekerja nama tarikh akhir
1 1 Betulkan pepijat pada bahagian hadapan 2022-06-01
2 2 Betulkan pepijat pada bahagian belakang 15-06-2022
3 5 Beli kopi 2022-07-01
4 5 Beli kopi 2022-08-01

Tetapi apa yang perlu ditulis dalam permintaan jika kita ingin mendapatkan tugas, sebagai contoh, untuk 30 hari yang lalu. Di mana 30 hari terakhir terikat secara langsung dengan masa pelaksanaan pertanyaan. Iaitu, jika pertanyaan dilaksanakan pada 25 Julai, maka anda perlu memilih tarikh dari 25 Jun hingga 24 Julai. Bagaimana untuk mengikat julat tarikh kepada masa semasa?

Untuk melakukan ini, gunakan fungsi penambahan tarikh:

DATE_ADD (date, INTERVAL expression units)

Saya fikir ia akan menjadi lebih mudah untuk menerangkan dengan beberapa contoh:

# Permintaan Hasilnya
1 DATE_ADD('2022-06-04', INTERVAL 5 HARI) 09-06-2022
2 DATE_ADD('2022-06-04', INTERVAL 4 MINGGU) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVAL 2 BULAN) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVAL 5 HARI) 30-05-2022
6 DATE_SUB('2022-06-04', INTERVAL 4 MINGGU) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVAL 2 BULAN) 2022-04-04

By the way, bilangan hari, minggu, bulan dan tahun tertentu juga boleh ditolak dari tarikh tertentu.

Dan jika kami kembali kepada permintaan kami - untuk mendapatkan data selama 30 hari yang lalu, maka kami memerlukan dua tarikh dalam julat ini:

  • CURDATE() - hujung julat
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - permulaan julat

Permintaan akan kelihatan seperti ini:

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

Hasil pertanyaan ini akan menjadi seperti ini (saya ada hari ini 4 Jun 2022):

ID id_pekerja nama tarikh akhir
1 1 Betulkan pepijat pada bahagian hadapan 2022-06-01

Bagaimana untuk mencari perbezaan antara dua tarikh

Dan satu lagi ciri berguna. Kadangkala anda mungkin perlu mengira perbezaan antara dua tarikh dalam hari. Untuk melakukan ini, SQL mempunyai fungsi khas - DATEDIFF ().

Ia sangat mudah untuk bekerja dengannya:

DATEDIFF (date 1, date 2)

Tarikh kedua hanya ditolak daripada tarikh pertama. Jika tarikh2 datang selepas tarikh1, maka hasilnya akan negatif.

Dengan cara ini, kami boleh menulis semula pertanyaan kami yang terdahulu menggunakan fungsi DATEDIFF(). Kita perlu memilih semua tugasan daripada jadual tugas yang tarikh akhir berbeza daripada tarikh semasa tidak lebih daripada 30 hari. Begini rupa permintaan itu:

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

Hasil pertanyaan ini akan menjadi seperti ini (saya ada hari ini 4 Jun 2022):

ID id_pekerja nama tarikh akhir
1 1 Betulkan pepijat pada bahagian hadapan 2022-06-01
2 2 Betulkan pepijat pada bahagian belakang 15-06-2022
3 5 Beli kopi 2022-07-01

Kali ini, SQL menemui sebanyak tiga baris. Fikirkan mengapa kali terakhir ada satu baris, dan kali ini ada tiga?