Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak porównać nakładające się wartości w wierszu?

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ę.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Narzędzie wiersza poleceń Doctrine 2; MAMP i mysql.sock

  2. Sprawdź połączenie mysql w sequelize

  3. Ciąg połączenia z bazą danych i sortowanie

  4. Node.js łączenie przez ssh

  5. Nie można modyfikować informacji nagłówka