Как узнать, открыты ли магазины или закрыты – работа с часами?

Каков наилучший способ хранить время открытия и закрытия магазина в базе данных, а также как рассчитать время на PHP?

Я придумал этот дизайн стола:

+----+---------+----------+-----------+------------+ | id | shop_id | week_day | open_hour | close_hour | +----+---------+----------+-----------+------------+ | 1 | 3 | 1 | 15:00:00 | 23:00:00 | | 2 | 3 | 2 | 15:00:00 | 23:00:00 | | 3 | 3 | 3 | 18:00:00 | 02:00:00 | | 4 | 3 | 4 | 18:00:00 | 02:00:00 | | 5 | 3 | 5 | 18:00:00 | 03:00:00 | +----+---------+----------+-----------+------------+ +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | shop_id | int(11) | NO | | NULL | | | week_day | int(11) | NO | | NULL | | | open_hour | time | NO | | NULL | | | close_hour | time | NO | | NULL | | +------------+---------+------+-----+---------+----------------+ 

Например, во вторник ( week_day = 2 ) он открывается в 3 часа ночи и закрывается в 11 вечера (вторник).

В среду (`week_day = 2 ') он открывается в 6 вечера и закрывается после полуночи в 2 часа ночи, которая будет в четверг. Как должно быть закрыто время полночи (00:00:00 или после) в базе данных?

Пусть говорят, что клиент хочет разместить заказ ( shop_id = 3 ) в 10 вечера во вторник, они должны быть в состоянии сделать это в соответствии с данными базы данных. Однако, если клиент хочет сделать заказ в 1:00 в четверг, но база данных показывает, что week_day = 3 закрывается в 02:00:00

Как писать на PHP, чтобы работать, если магазин открыт или нет? это кажется сложным!

Нужно ли мне менять дизайн таблицы, чтобы было проще писать на PHP?

Вы можете рассмотреть возможность правильной верстки таблицы

 +----+---------+----------+-----------+------------+ | id | shop_id | week_day | open_hour | close_hour | +----+---------+----------+-----------+------------+ | 1 | 3 | 1 | 15:00:00 | 23:00:00 | | 2 | 3 | 2 | 15:00:00 | 23:00:00 | | 3 | 3 | 3 | 18:00:00 | 23:59:59 | | 4 | 3 | 4 | 00:00:00 | 02:00:00 | | 5 | 3 | 4 | 18:00:00 | 23:59:59 | | 6 | 3 | 5 | 00:00:00 | 02:00:00 | | 7 | 3 | 5 | 18:00:00 | 23:59:59 | | 8 | 3 | 6 | 00:00:00 | 03:00:00 | +----+---------+----------+-----------+------------+ 

Затем используйте следующий вид (этот запрос для вторника в 22:00, как вы упомянули):

 SELECT count(*) FROM `shop` WHERE week_day=3 and open_hour<='22:00:00' and close_hour>='22:00:00' 

Я думаю, вы могли бы сделать такой SQL-вопрос, как это, и проверить, возвращают ли запрос какие-либо результаты:

 SELECT * FROM opening_hours_table WHERE shop_id = your_shop_id AND week_day = WEEKDAY(NOW()) + 1 AND open_hour < NOW() AND close_hour > NOW() 

Если вы вернете результат, то в часы работы.

Изменить: Сделано несколько синтаксических исправлений для SQL.

Поскольку я могу понять (и исправить меня, если я не понимаю), вы должны проверить, находится ли время между open_hour и 23:59 текущего дня и между 00:00 и close_hour следующего дня.

Это должно быть сделано в коде APP, а не в базе данных.

ИМХО, вы правы с вашим дизайном БД!