Шахкалпеш отговори на въпроса с:
Публикувах коментар, който смятам за неправилен, като дадох няколко противоположни примера:
В отговор на моя коментар Шахкалпеш поиска:
Справедливо - да. Леко редактиран, въпросът казва:
- от 7 до 13 ч. или
- от 9 до 13 ч. или
- от 9 до 17 ч.
Достатъчно фон. Можем да игнорираме датата на срещите и просто да вземем предвид часовете. Предполагам, че има лесен начин да ограничите записаните времена до формат hh:mm; не всички СУБД всъщност предоставят това, но разширението за обработка на hh:mm:ss е тривиално.
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
При търсене на срещи, припокриващи се в диапазона 09:00 - 13:00, заявката на Shahkalpesh (опростена) става:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
Това ще върне всичките шест реда данни. Въпреки това, само редове 1, 2, 3 се припокриват с периода 09:00 - 13:00. Ако редове 1, 2 и 3 са единствените валидни представителни стойности за назначение, тогава запитването на Шахкалпеш дава правилния отговор. Въпреки това, ако ред 4 (който според мен е правдоподобно валиден) е разрешен, тогава той не трябва да се връща. По същия начин, редове 5 и 6 - ако има - не трябва да се връщат. [Всъщност, ако приемем timeStart <= timeEnd
за всички редове в таблицата (и няма стойности NULL, които да объркат нещата), можем да видим, че заявката на Shahkalpesh ще върне ВСЯКАКЪВ ред данни за заявката 09:00-13:00, защото или началният час на редът е по-голям от 09:00 или крайният час е по-малък от 13:00 или и двете. Това е равносилно на писане 1 = 1
или друга тавтология в клаузата WHERE. ]
Ако разгледаме заявката на ShaneD (опростена):
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
виждаме, че той също избира редове 1, 2 и 3, но отхвърля редове 4 (защото timeStart> '13:00'), 5 (защото timeEnd <'09:00') и 6 (защото timeStart> '13:00'). Този израз е архетипен пример за това как да избирате редове, които се „припокриват“, като се броят „среща“ и „среща се от“ (вижте „Интервалната алгебра на Алън ", например) като припокриващи се. Промяната на '>=' и '<=' променя набора от интервали, отчитани като припокриващи се.