Я пытаюсь выяснить, есть ли магазин в течение его часов работы, если нет, то выберите в следующий раз его открытие.
Наконец, я должен уметь назначить день открытия как конкретную дату.
Может ли кто-нибудь дать мне подсказку, как построить этот запрос?
заранее спасибо
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 = понедельник, … Если ваша таблица хранит будние дни в другом формате, вы должны соответствующим образом настроить запрос.