Как бы вы справлялись со временем и после полуночи в PHP / MySQL?
Использовать INT
хранить минут или использовать поле типа TIME
?
Рассмотрим 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
.
Предположим, что open_time – «18:00», close_time – «02:00», текущее время – «22:41». У нас есть отдельная запись DB для close_time (потому что это после полуночи), но мы никогда не получим ее в результате, потому что close_time «02:00» НЕ больше текущего времени, «22:41».
Кроме того, если текущее время «01:00», мы получим значения NEXT day, потому что день недели не соответствует.
Так в чем же решение?
Вы предпочли бы хранить эти значения в INT
(минуты), чтобы php мог обрабатывать эти значения напрямую, без какого-либо преобразования?
Например…
Текущее время:
// w = Day of the week, H = 24-hour format, i = Minutes $timearr = explode(':',date("w:H:i")); $currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
В базе данных хранятся значения времени открытия / закрытия в минутах.
Предположим теперь, что текущее время – «Солнце, 01:00» (первый день недели), выполняющее вышеуказанное coversion, это значение равно 60; и дни открытия / закрытия для последнего дня недели (суббота) установлены на «17:00» и «02:00» (что фактически на воскресенье), которые хранятся в БД как 9660 и 10200 (суббота, 26:00) , В этом случае вышеуказанный запрос не найдет нужную нам запись (Sat, 17:00, 02:00), потому что у нас, вероятно, нет open_time меньше, чем «02:00» (120). Чтобы решить эту проблему, мы конвертируем «Sun, 01:00» в «Sat, 25:00», добавив 7 * 1440 (целую неделю) к текущему времени $, что приведет к 10140. Затем запрос DB выглядит следующим образом:
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);
Или что альтернативное решение?
Хранение минуты (int (4) без знака) – путь.
Однако вместо сохранения дня недели + открытия_часа, закрытия часа (со смещением),
вы должны сохранить минуту с понедельника 12 утра: –
Monday 18:00 = (1 - 1)*60 * 18 = 1080 Tuesday 02:00 = (2 - 1)*60 * 24 + (2 * 60) = 1560 ... // please take note shop could have different operating hour for each day
Итак, текущее время – вторник 1:30, а именно: –
// mysql expression $expr = (weekday(current_timestamp)+1) * 1440 + (hour(current_timestamp)*60) + minute(current_timestamp)
SQL: –
select ... from opening_hours where open_time >= $expr and close_time <= $expr;
SELECT open_time,close_time FROM open_hours WHERE (open_time <= close_time AND open_time <= $currenttime AND close_time >= $currenttime) OR (open_time >= close_time AND ($currenttime <= close_time OR $currenttime >= open_time))
Итак, что я делаю здесь, если open_time больше, чем close_time, то он должен охватывать полночь, и в этом случае я проверяю, чтобы текущий таймер был больше, чем время открытия, или меньше, чем близкое время, поэтому оно гарантировано в наше время пролет
Время открытия —— Полночь —– Время закрытия
Если время открытия меньше времени закрытия, то мы знаем, что середина ночи не падает между ними. В результате мы можем просто проверить как обычно.
Я не знаю, что вы пытаетесь сделать, но использование временных меток unix всегда было правильным ответом в моем варианте. его легче подсчитать, и он всегда прав, независимо от часовых поясов.
Возможно, вам стоит заглянуть в это