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

Bagaimana cara membandingkan nilai yang tumpang tindih dalam satu baris?

Shahkalpesh menjawab pertanyaan itu dengan:

Saya memposting komentar yang saya anggap salah, memberikan sepasang contoh tandingan:

Sebagai tanggapan atas komentar saya, Shahkalpesh meminta:

Cukup adil - ya. Sedikit diedit, pertanyaannya berbunyi:

  • dari jam 7 pagi sampai jam 1 siang, atau
  • dari jam 9 pagi sampai jam 1 siang, atau
  • dari jam 9 pagi sampai jam 5 sore.

Latar belakang yang cukup. Kita bisa mengabaikan tanggal janji, dan hanya mempertimbangkan waktunya. Saya berasumsi bahwa ada cara mudah untuk membatasi waktu yang direkam ke format jj:mm; tidak semua DBMS benar-benar menyediakannya, tetapi ekstensi untuk menangani jj:mm:dd adalah sepele.

Appointments

Row     timeStart   timeEnd   Note
  1     07:00       13:00     First valid range
  2     09:00       13:00     Second valid range
  3     09:00       17:00     Third valid range
  4     14:00       17:00     First plausibly valid range
  5     05:00       06:00     First probably invalid range
  6     18:00       22:30     Second probably invalid range

Mengingat pencarian janji temu tumpang tindih antara pukul 09:00 - 13:00, kueri Shahkalpesh (yang disederhanakan) menjadi:

SELECT * FROM Appointments
    WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')

Ini akan mengembalikan semua enam baris data. Namun, hanya baris 1, 2, 3 yang tumpang tindih dengan periode waktu 09:00 - 13:00. Jika baris 1, 2, dan 3 adalah satu-satunya nilai penunjukan representatif yang valid, maka kueri Shahkalpesh menghasilkan jawaban yang benar. Namun, jika baris 4 (yang menurut saya valid) diizinkan, maka tidak boleh dikembalikan. Demikian pula, baris 5 dan 6 - jika ada - tidak boleh dikembalikan. [Sebenarnya, dengan asumsi timeStart <= timeEnd untuk semua baris dalam tabel (dan tidak ada nilai NULL untuk mengacaukan segalanya), kita dapat melihat bahwa kueri Shahkalpesh akan mengembalikan APAPUN baris data untuk kueri 09:00-13:00 karena waktu mulai dari baris lebih besar 09:00 atau waktu berakhir kurang dari 13:00 atau keduanya. Ini sama saja dengan menulis 1 = 1 atau tautologi lainnya dalam klausa WHERE. ]

Jika kita mempertimbangkan kueri ShaneD (seperti yang disederhanakan):

SELECT * FROM Appointments
    WHERE timeStart <= '13:00' AND timeEnd >= '09:00'

kita melihat bahwa itu juga memilih baris 1, 2, dan 3, tetapi menolak baris 4 (karena timeStart> '13:00'), 5 (karena timeEnd <'09:00') dan 6 (karena timeStart> '13:00'). Ungkapan ini adalah contoh pola dasar tentang cara memilih baris yang 'tumpang tindih', menghitung 'bertemu' dan 'bertemu' (lihat "Aljabar Interval Allen ", misalnya) sebagai tumpang tindih. Mengubah '>=' dan '<=' mengubah set interval yang dihitung sebagai tumpang tindih.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. int(11) vs. int(lainnya)

  2. Gabung kiri kondisi ON DAN sintaks kondisi lain dalam Doktrin

  3. Secara efektif memilih catatan (jarak) terdekat dari database

  4. penggantian mysql_num_rows untuk direkomendasikan?

  5. Deteksi Pengguna yang Melihat Halaman Web yang Sama, atau URL