5

我想知道一家商店目前是否在营业时间内,如果没有,则选择下次营业时间。

最后,我需要能够将开幕日设置为特定日期。

有人可以给我一个提示如何构建这个查询吗?

提前致谢

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 分钟递增的可选时间戳。

例如,如果一家商店刚刚关门(下午 1 点),我将需要改用下一个营业日的开/关时间。(这家店不一定每天都开门,周日可能不营业)。

4

2 回答 2

3

找出shop_id,这是开放的NOW()

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

过时的

要查找明天的可用open_times:

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

如果你想1 = Monday ... 7 = Sunday在你的day_of_week字段中使用 ISO 格式,你应该将 php 绑定date('N')到你的查询(或使用 Mysql 的 if 函数IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w')),但这很难看)

于 2012-10-27T14:09:03.343 回答
2

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 = 星期一,... 如果您的表以不同的格式存储工作日,则必须相应地调整查询。

于 2012-10-27T14:08:34.190 回答