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

Membandingkan rentang tanggal

Ini adalah masalah klasik, dan sebenarnya lebih mudah jika Anda membalik logikanya.

Biarkan saya memberi Anda sebuah contoh.

Saya akan memposting satu periode waktu di sini, dan semua variasi berbeda dari periode lain yang tumpang tindih dalam beberapa hal.

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

di sisi lain, izinkan saya memposting semua yang tidak tumpang tindih:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

Jadi jika Anda sederhana, kurangi perbandingannya menjadi:

starts after end
ends before start

lalu Anda akan menemukan semua titik yang tidak tumpang tindih, lalu Anda akan menemukan semua titik yang tidak cocok.

Untuk contoh NOT IN LIST akhir Anda, Anda dapat melihat bahwa itu cocok dengan dua aturan tersebut.

Anda perlu memutuskan apakah periode berikut DI atau DI LUAR rentang Anda:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

Jika tabel Anda memiliki kolom bernama range_end dan range_start, berikut beberapa SQL sederhana untuk mengambil semua baris yang cocok:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

Perhatikan TIDAK di sana. Karena dua aturan sederhana menemukan semua tidak cocok baris, NOT sederhana akan membalikkannya untuk mengatakan:jika bukan salah satu dari baris yang tidak cocok, itu harus salah satu yang cocok .

Menerapkan logika pembalikan sederhana di sini untuk menghilangkan NOT dan Anda akan mendapatkan:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja MYSQL ATAU vs IN

  2. Bagaimana cara memasukkan file ke database MySQL?

  3. Kode Kesalahan:2013. Koneksi terputus ke server MySQL selama kueri

  4. Cari semua kemunculan string dalam database mysql

  5. MySQL memberikan semua hak istimewa ke database kecuali satu tabel