Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да сравня припокриващи се стойности в един ред?

Шахкалпеш отговори на въпроса с:

Публикувах коментар, който смятам за неправилен, като дадох няколко противоположни примера:

В отговор на моя коментар Шахкалпеш поиска:

Справедливо - да. Леко редактиран, въпросът казва:

  • от 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'). Този израз е архетипен пример за това как да избирате редове, които се „припокриват“, като се броят „среща“ и „среща се от“ (вижте „Интервалната алгебра на Алън ", например) като припокриващи се. Промяната на '>=' и '<=' променя набора от интервали, отчитани като припокриващи се.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защита от SQL инжекция

  2. Грешка при импортирането на SQL дъмп в MySQL:Неизвестна база данни / Не мога да създам база данни

  3. Върнете както резултат от заявката, така и брой редове

  4. подзаявка (Неправилни аргументи за ПРОТИВ), използвайки Mysql

  5. dpkg:пакет за обработка на грешка mysql-server (проблеми със зависимостта)?