sql >> Databáze >  >> RDS >> Mysql

Jak porovnám překrývající se hodnoty v rámci řádku?

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.



  1. Je nějaká škoda při resetování automatického přírůstku?

  2. Chyba při analýze dat org.json.JSONException:Konec vstupu na znaku 0 z - Android

  3. Můžeme redistribuovat Oracle tools.jar?

  4. Nainstalujte PostgreSQL na Ubuntu 20.04