Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan MySQL untuk rentang tanggal tertentu

Sungguh menakjubkan tidak ada yang memperhatikan ini selama hampir dua tahun, tetapi jawaban lainnya salah karena mereka tidak memperhitungkan kasus ketika tanggal mulai dan tanggal akhir berada di luar cakupan rentang pencarian. Pertimbangkan ini adalah rentang tanggal:

start_date <<---------------------------- date range --------------------------->> end_date

Dan inilah jangkauan pencarian kami:

start_date <<---------------------------- date range --------------------------->> end_date

                 start_search <<-------- search range -------->> end_search

Pencarian harus memberi kita hasil positif karena mereka berpotongan. Tetapi jika Anda menggunakan jawaban lain, Anda akan mendapatkan hasil negatif karena tidak ada start_date atau end_date berada di antara start_search dan end_search .

Untuk mendapatkan solusinya, mari kita menggambar semua 4 mode yang memungkinkan persimpangan:

                  start_date <<---------- date range --------------------------->> end_date

start_search <<------------------------- search range -------->> end_search
start_date <<---------------------------- date range ---------->> end_date

               start_search <<---------- search range ------------------------>> end_search
start_date <<---------------------------- date range --------------------------->> end_date

                 start_search <<-------- search range -------->> end_search
                 start_date <<----------- date range -------->> end_date

start_search <<------------------------- search range ------------------------>> end_search

Anda dapat OR semua 4 kasus yang mungkin untuk mendapatkan solusi langsung:

select*from table where

   /* 1st case */ start_date between start_search and end_search         
or /* 2nd case */  end_date  between start_search and end_search         
or /* 3rd case */ (start_date <= start_search and end_date >= end_search)
or /* 4th case */ (start_date >= start_search and end_date <= end_search)

/* the 4th case here is actually redundant since it is being covered by the 1st and 2nd cases */

Solusi yang kurang mudah adalah:

select*from table where

    start_date  between start_search and end_search /* covers 1st and 4th cases */          
or start_search between  start_date  and  end_date  /* covers 2nd and 3rd cases */

Cobalah untuk memvisualisasikannya menggunakan diagram di atas.

Jika kita mencoba mengekstrapolasi pola dari 4 diagram di atas, kita dapat melihat bahwa selama perpotongan, end_date selalu >= start_search , dan di sisi lain, start_date selalu <= end_search . Memang, memvisualisasikan lebih jauh, kita dapat melihat bahwa ketika kedua kondisi tersebut terpenuhi, kita tidak dapat tidak memiliki persimpangan .

Dengan demikian, solusi lain sesederhana:

select*from table where

end_date >= start_search && start_date <= end_search

Dan kelebihan dari solusi ini adalah kita hanya membutuhkan 2 perbandingan. Bandingkan dengan "OR semua" pendekatan yang membutuhkan dari 2 hingga sebanyak 8 (3 + 3 + 2) perbandingan. (Setiap between panggilan terdiri dari 3 perbandingan .)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jenis penginisialisasi untuk 'System.Data.Entity.Migrations.DbMigrationsConfiguration`1' memberikan pengecualian

  2. Cara membuka blokir dengan host flush mysqladmin

  3. kesalahan:perintah 'x86_64-linux-gnu-gcc' saat menginstal mysqlclient

  4. Cara tercepat untuk memasukkan 134675 nilai dalam basis data jarak jauh

  5. Mengunci dan konkurensi dengan MySQL