Это подразумевается как дополнительный ответ на решение Тима
Разбивка вашего раздела ГДЕ (я снял лишние скобки)
WHERE IF(start_time < '14:00', '14:00', start_time) >= '14:00' /** Line 1 */
AND IF(end_time > '15:00', '15:00', end_time) >= '14:00' /** Line 2 */
AND IF(start_time < '14:00', '14:00', start_time) <= '15:00' /** Line 3 */
AND IF(end_time > '15:00', '15:00', end_time) <= '15:00' /** Line 4 */
AND `appoint_date` = '2018-11-30'
Взгляд на строку1, IF(start_time < '14:00', '14:00', start_time)
всегда будет возвращать время, большее или равное '14:00'
для ненулевого start_time .. таким образом, эта строка совпадает с WHERE start_time IS NOT NULL
Аналогично строка 4 может быть переписана AND end_time IS NOT NULL
Глядя на строку 2, довольно просто увидеть, что это эквивалентно AND start_time <= '15:00'
.Любые манипуляции start_time с помощью IF влияют только на времена, которые приводят к истинному результату, и сохраняют их истинными
Точно так же строку 3 можно переписать AND end_time >= '14:00'
Соединяя все это вместе
WHERE start_time IS NOT NULL /** Line 1 */
AND end_time >= '14:00' /** Line 2 */
AND start_time <= '15:00' /** Line 3 */
AND end_time IS NOT NULL /** Line 4 */
AND `appoint_date` = '2018-11-30'
Теперь, когда любое сравнение с нулевым операндом возвращает false, строка 3 фактически дает вам строку 1 бесплатно
Аналогично, строка 2 фактически дает вам строку 4 бесплатно
Удалениеэти лишние строки, вы в конечном итоге с Тимом WHERE
WHERE end_time >= '14:00'
AND start_time <= '15:00'
AND appoint_date = '2018-11-30'
Addendum
Еще одно преимущество рефакторинга ваши предложения IF в Тиме WHERE является то, что это позволяет двигателюиспользовать индекс start_time или end_time, чтобы удовлетворить эти условия.Это может дать значительный выигрыш в производительности