Рассмотрим SQL-запрос ниже:
SELECT * FROM opening_hours
WHERE week_day = WEEKDAY(NOW()) + 1
AND open_hour =< date_format(now(),'%H:%i')
AND close_hour >= date_format(now(),'%H:%i')
open_hour
/ close_hour
поля типа TIME.
Я использую MySQL.
Предположим, что open_time«18:00», close_time «02:00», текущее время «22:41».У нас есть отдельная запись в БД для close_time (потому что это после полуночи), но мы никогда не получим ее в результате, потому что close_time "02:00" НЕ больше текущего времени, "22:41".
Также, если текущее время равно «01:00», мы получим СЛЕДУЮЩИЕ значения дня, потому что день недели не совпадает.
Решение?
Вы бы предпочли хранить эти значения в целых числах (минутах), чтобы php мог обрабатывать эти значения напрямую, без какого-либо преобразования?
Например ...
Текущее время:
$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
Минимальное значение текущего времени = 0 (вс, 00:00), максимальное значение 10079 (сб, 23:59)
В базе данных хранятся значения времени открытия / закрытияможет быть между 0 и 11519 (сб, 47:59)
Теперь предположим, что текущее время - «Солнце, 01:00» (первый день недели), при выполнении вышеуказанного покрытия это значение равно 60;и время открытия / закрытия для последнего дня недели (суббота) установлено на «17:00» и «02:00» (что фактически является воскресеньем), сохраненных в БД как 9660 и 10200 (суббота, 26:00),В этом случае вышеупомянутый запрос не найдет нужную нам запись (Сб, 17:00, 02:00), потому что у нас, вероятно, нет open_time меньше, чем «02:00» (120).Чтобы решить эту проблему, мы конвертируем «Sun, 01:00» в «Sat, 25:00», добавляя 7 * 1440 (целую неделю) к $ currenttime, что приведет к 10140. Затем запрос к БД будет выглядеть так:
SELECT open_time,clos_time FROM open_hours
WHERE (open_time <= $currenttime
AND close_time >= $currenttime)
OR (open_time <= $currenttime +10080
AND close_time >= $currenttime + 10080);
Или что такое альтернативное и аккуратное решение?