Shahkalpesh odpověděl na otázku:
Zveřejnil jsem komentář, že to považuji za nesprávné, a uvedl jsem pár protipříkladů:
V reakci na můj komentář Shahkalpesh požádal:
Spravedlivé - ano. Mírně upraveno, otázka zní:
- od 7:00 do 13:00 nebo
- od 9:00 do 13:00 nebo
- od 9:00 do 17:00.
Dostatek zázemí. Můžeme ignorovat datum schůzek a vzít v úvahu časy. Předpokládám, že existuje snadný způsob, jak omezit zaznamenané časy na formát hh:mm; ne všechny DBMS to ve skutečnosti poskytují, ale rozšíření pro zpracování hh:mm:ss je triviální.
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
Při hledání schůzek, které se překrývají v rozmezí 09:00 - 13:00, Shahkalpeshův (zjednodušený) dotaz zní:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
Tím se vrátí všech šest řádků dat. Pouze řádky 1, 2, 3 se však překrývají s časovým úsekem 09:00 - 13:00. Pokud jsou řádky 1, 2 a 3 jedinými platnými reprezentativními hodnotami schůzek, pak Shahkalpeshův dotaz poskytne správnou odpověď. Pokud je však řádek 4 (což si myslím, že je pravděpodobně platný) povolen, neměl by být vrácen. Podobně by se neměly vracet řádky 5 a 6, pokud jsou přítomny. [Vlastně, za předpokladu timeStart <= timeEnd
pro všechny řádky v tabulce (a nejsou tam žádné hodnoty NULL, které by to mohly zkazit), vidíme, že Shahkalpeshův dotaz vrátí JAKÝKOLI řádek dat pro dotaz 09:00-13:00, protože buď čas zahájení řádek je větší než 09:00 nebo čas ukončení je menší než 13:00 nebo obojí. To se rovná psaní 1 = 1
nebo jakákoli jiná tautologie v klauzuli WHERE. ]
Pokud vezmeme v úvahu dotaz ShaneDa (zjednodušeně):
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
vidíme, že také vybere řádky 1, 2 a 3, ale odmítne řádky 4 (protože timeStart> '13:00'), 5 (protože timeEnd <'09:00') a 6 (protože timeStart> '13:00'). Tento výraz je typickým příkladem toho, jak vybrat řádky, které se „překrývají“, přičemž se počítají „splňuje“ a „splňuje“ (viz „Allenova intervalová algebra ", například) jako překrývající se. Změna '>=' a '<=' změní sadu intervalů, které se počítají jako překrývající se.