Shahkalpesh odpowiedział na pytanie:
Zamieściłem komentarz, który uważam za błędny, podając parę kontrprzykładów:
W odpowiedzi na mój komentarz Shahkalpesh poprosił:
Wystarczająco uczciwe - tak. Nieco zredagowane pytanie brzmi:
- od 7:00 do 13:00 lub
- od 9:00 do 13:00 lub
- od 9:00 do 17:00.
Wystarczająco tło. Możemy zignorować terminy spotkań i po prostu wziąć pod uwagę godziny. Zakładam, że istnieje prosty sposób na ograniczenie czasu nagrywania do formatu gg:mm; nie wszystkie DBMS faktycznie to zapewniają, ale rozszerzenie do obsługi hh:mm:ss jest trywialne.
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
Biorąc pod uwagę wyszukiwanie spotkań pokrywających się z zakresem 09:00 - 13:00, zapytanie Shahkalpesha (uproszczone) staje się:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
Spowoduje to zwrócenie wszystkich sześciu wierszy danych. Jednak tylko wiersze 1, 2, 3 nakładają się na okres od 09:00 do 13:00. Jeśli wiersze 1, 2 i 3 są jedynymi prawidłowymi reprezentatywnymi wartościami spotkań, zapytanie Shahkalpesha daje poprawną odpowiedź. Jeśli jednak wiersz 4 (który moim zdaniem jest prawdopodobnie poprawny) jest dozwolony, to nie powinien być zwracany. Podobnie wiersze 5 i 6 - jeśli są obecne - nie powinny być zwracane. [Właściwie, zakładając timeStart <= timeEnd
dla wszystkich wierszy w tabeli (i nie ma wartości NULL, które mogłyby zepsuć), widzimy, że zapytanie Shahkalpesha zwróci DOWOLNY wiersz danych dla zapytania 09:00-13:00, ponieważ albo czas rozpoczęcia wiersz jest większy niż 09:00 lub czas zakończenia jest krótszy niż 13:00 lub oba te elementy. To jest równoznaczne z pisaniem 1 = 1
lub jakąkolwiek inną tautologię w klauzuli WHERE. ]
Jeśli weźmiemy pod uwagę zapytanie ShaneDa (w uproszczeniu):
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
widzimy, że wybiera również wiersze 1, 2 i 3, ale odrzuca wiersze 4 (ponieważ timeStart> '13:00'), 5 (ponieważ timeEnd <'09:00') i 6 (ponieważ timeStart> '13):00'). To wyrażenie jest archetypowym przykładem tego, jak wybrać wiersze, które „nakładają się”, licząc „spotkania” i „spotkania” (patrz „Algebra interwałów Allena ”, na przykład) jako nakładające się. Zmiana „>=” i „<=” zmienia zestaw interwałów liczonych jako nakładające się.