寻找下一次业务开放; mysql小时计算

Kri*_*ian 5 php mysql sql select

我想弄清楚一家商店目前是否在营业时间内,如果没有,那么下一次营业时请选择.

最后,我需要能够将开幕日作为具体日期.

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

提前致谢

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');
Run Code Online (Sandbox Code Playgroud)

编辑:

为了澄清一点,我不打算找到开放的商店,但只有一个特定商店的营业时间.根据开盘/收盘时间,以及现在的时间.我将生成一些可选的时间戳,增加15分钟.

例如,如果一家商店刚刚关闭(下午1点),我将需要使用下一个开放日的开放/关闭时间.(商店不一定每天开放,周日可以关闭).

poz*_*ozs 3

要查找 shop_id,该 ID 的开放时间为NOW()

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

过时的

要查找明天的可用open_time时间:

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

编辑2:

要查找下一个可用的open_time

  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`
Run Code Online (Sandbox Code Playgroud)

编辑

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')),但这很丑陋)