Найти в следующий раз бизнес открыт; расчет mysql часов

Я пытаюсь выяснить, есть ли магазин в течение его часов работы, если нет, то выберите в следующий раз его открытие.

Наконец, я должен уметь назначить день открытия как конкретную дату.

Может ли кто-нибудь дать мне подсказку, как построить этот запрос?

заранее спасибо

CREATE TABLE `shop_hours` ( `id` int(11) NOT NULL, `shop_id` int(11) unsigned NOT NULL, `day_of_week` int(11) unsigned NOT NULL, `open_time` time NOT NULL, `close_time` time NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `shop_hours` (`id`, `shop_id`, `day_of_week`, `open_time`, `close_time`) VALUES (1, 1, 0, '08:00:00', '24:00:00'), (2, 1, 1, '08:00:00', '24:00:00'), (3, 1, 2, '08:00:00', '24:00:00'), (4, 1, 3, '08:00:00', '24:00:00'), (5, 1, 4, '08:00:00', '24:00:00'), (6, 1, 5, '08:00:00', '24:00:00'), (7, 1, 6, '08:00:00', '24:00:00'); 

Редактировать:

Чтобы немного разъяснить, я не ищу, чтобы найти открытые магазины, но только часы работы для ОДНОГО конкретного магазина. На основе часа открытия / закрытия и в какое время это сейчас. Я буду генерировать некоторые выбираемые временные метки, увеличивающиеся на 15 минут.

Например, если магазин только что закрыт (1PM), мне нужно будет использовать следующее время открытия / закрытия следующего дня. (магазин не обязательно открыт каждый день, может быть закрыт по воскресеньям).

Чтобы узнать, где находится shop_id, это открыто для NOW()

 SELECT * FROM `shop_hours` WHERE `day_of_week` = DATE_FORMAT(NOW(), '%w') AND CURTIME() BETWEEN `open_time` AND `close_time` 

Устаревшее :

Чтобы найти доступные в open_time s:

 SELECT * FROM `shop_hours` WHERE `day_of_week` = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%w') 

Изменить 2:

Чтобы найти следующие доступные open_time s:

  SELECT `shop_id`, MIN(CAST(CONCAT(DATE(DATE_ADD(NOW(), INTERVAL ((7 + DATE_FORMAT(NOW(), '%w') - `day_of_week`) % 7) DAY)), ' ', `open_time`) AS DATETIME)) AS `next_open_datetime` FROM `shop_hours` GROUP BY `shop_id` 

Изменить :

DATE_FORMAT(*DATE*, '%w') использует формат 0 = Sunday ... 6 = Saturday

Если вы хотите использовать формат ISO 1 = Monday ... 7 = Sunday в поле day_of_week , вы должны привязать date('N') php date('N') к вашему запросу (или использовать функцию Mysql if if IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w')) , но это уродливо)

1) Проверьте, открыт ли магазин. Результат пуст, если магазин закрыт:

 select * from shop_hours where shop_id = $id and dayofweek(curdate()) = day_of_week and curtime() between open_time and close_time; 

2) Найдите следующее время открытия:

 (select open_time from shop_hours where shop_id = $id and curtime() < open_time and day_of_week >= dayofweek(curdate())) union (select open_time from shop_hours where shop_id = $id and curtime() < open_time order by day_of_week) union (select open_time from shop_hours where shop_id = $id and curtime() > close_time and day_of_week >= dayofweek(curdate())) union (select open_time from shop_hours where shop_id = $id and curtime() > close_time order by day_of_week) limit 1; 

Непроверенный, но это должно уважать выходные дни и дыры в неделю (т. Е. Закрытые дни).

Имейте в виду, что dayofweek () числа 1 = воскресенье, 2 = понедельник, … Если ваша таблица хранит будние дни в другом формате, вы должны соответствующим образом настроить запрос.