получить даты из базы данных, где с особыми условиями

#mysql #mariadb

Вопрос:

я построил эту скрипку для тебя: https://dbfiddle.uk/?rdbms=mariadb_10.5amp;fiddle=35f21ff5601276b4dba0e9250594d101

Существует запрос, который должен получить все временные интервалы дня со следующими условиями:

  • нет временных интервалов с обслуживанием 1 или 3 в этот день? > Получить все временные интервалы
  • есть ли одна или несколько служб с 1 или 3 в этот день ? > Получите все временные интервалы до этого сервиса

это прекрасно работает ! Но теперь у меня новая проблема !

  • есть ли доступная услуга 0, как показано на скрипке, дополнительные временные интервалы после этой услуги 0.

скрипка показывает мне результат:

 2021-07-07 14:00:00
 

Но я хотел бы также

 2021-07-07 16:00:00
 

потому что перед этим слотом находится услуга = 0

Вы можете мне помочь, пожалуйста??

Ответ №1:

Если вы имеете в виду «непосредственно перед тем, как этот слот станет сервисом = 0″, попробуйте:

 SELECT * FROM `timeslots` ts
WHERE (
        NOT EXISTS (
            SELECT NULL FROM `timeslots` ts2
            WHERE DATE(ts2.`timeslot`) = DATE(ts.`timeslot`)
            AND TIME(ts2.`timeslot`) <= TIME(ts.`timeslot`)
            AND `service` != 2
        )
    OR
        EXISTS (
            SELECT NULL FROM `timeslots` ts2
            WHERE DATE(ts2.`timeslot`) = DATE(ts.`timeslot`)
            AND DATE_SUB(ts.`timeslot`, INTERVAL 1 HOUR) = ts2.`timeslot`
            AND ts2.`service` = 0
        )    
    )
AND `timeslot` > DATE_ADD(CURDATE(), INTERVAL 1 DAY)
ORDER BY `timeslot`
 

См. db-скрипка