Mencari acara dalam 30 hari terakhir

Tugas umum lainnya adalah mencari baris yang termasuk dalam rentang tanggal tertentu. Pada prinsipnya, ini tidak sulit jika tanggal awal dan akhir rentang sudah diperbaiki: SQL dapat membandingkan tanggal serta angka.

Operator perbandingan dapat diterapkan pada tanggal: < , > , <= , dll. Selain itu, ada operator BETWEEN khusus yang juga dapat bekerja dengan tanggal. Misalnya, mari tulis kueri yang akan memilih semua tugas dari tabel tugas yang harus diselesaikan pada musim panas 2022. Permintaan akan terlihat seperti ini:

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

Hasil dari kueri ini adalah:

pengenal employee_id nama tenggat waktu
1 1 Perbaiki bug di frontend 01-06-2022
2 2 Perbaiki bug di backend 15-06-2022
3 5 Beli kopi 01-07-2022
4 5 Beli kopi 01-08-2022

Tapi apa yang harus ditulis di permintaan jika kita ingin mendapatkan tugas, misalnya selama 30 hari terakhir. Di mana 30 hari terakhir terkait langsung dengan waktu eksekusi kueri. Artinya, jika kueri dijalankan pada 25 Juli, maka Anda harus memilih tanggal dari 25 Juni hingga 24 Juli. Bagaimana cara mengikat rentang tanggal ke waktu saat ini?

Untuk melakukannya, gunakan fungsi penambahan tanggal:

DATE_ADD (date, INTERVAL expression units)

Saya pikir akan lebih mudah untuk menjelaskan dengan beberapa contoh:

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

Omong-omong, sejumlah hari, minggu, bulan, dan tahun tertentu juga dapat dikurangi dari tanggal tertentu.

Dan jika kami kembali ke permintaan kami - untuk mendapatkan data selama 30 hari terakhir, maka kami memerlukan dua tanggal dalam rentang ini:

  • CURDATE() - akhir rentang
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - rentang awal

Permintaan akan terlihat seperti ini:

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

Hasil dari kueri ini akan menjadi seperti ini (saya punya hari ini 4 Juni 2022):

pengenal employee_id nama tenggat waktu
1 1 Perbaiki bug di frontend 01-06-2022

Bagaimana menemukan perbedaan antara dua tanggal

Dan fitur bermanfaat lainnya. Terkadang Anda mungkin perlu menghitung perbedaan antara dua tanggal dalam beberapa hari. Untuk melakukan ini, SQL memiliki fungsi khusus - DATEDIFF ().

Sangat mudah untuk bekerja dengannya:

DATEDIFF (date 1, date 2)

Tanggal kedua hanya dikurangi dari tanggal pertama. Jika tanggal2 datang setelah tanggal1, maka hasilnya akan negatif.

Omong-omong, kita bisa menulis ulang kueri kita sebelumnya menggunakan fungsi DATEDIFF(). Kita perlu memilih semua tugas dari tabel tugas yang batas waktunya berbeda dari tanggal saat ini tidak lebih dari 30 hari. Seperti inilah permintaan itu:

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

Hasil dari kueri ini akan menjadi seperti ini (saya punya hari ini 4 Juni 2022):

pengenal employee_id nama tenggat waktu
1 1 Perbaiki bug di frontend 01-06-2022
2 2 Perbaiki bug di backend 15-06-2022
3 5 Beli kopi 01-07-2022

Kali ini, SQL menemukan sebanyak tiga baris. Pikirkan mengapa terakhir kali ada satu baris, dan kali ini ada tiga baris?