Работа со временем и после полуночи

Как бы вы справлялись со временем и после полуночи в 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 всегда было правильным ответом в моем варианте. его легче подсчитать, и он всегда прав, независимо от часовых поясов.

Возможно, вам стоит заглянуть в это