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.