[英]mysql open hours past midnight
我正在建立一个api,其中有午夜后开放的酒吧的清单。 我在查明它们当前是打开还是关闭时遇到了问题。
举例来说,这些酒吧之一的营业时间如下:
Monday
open time = 20:00
closed time = 05:00
Tuesday
open time = 20:00
closed time = 04:00
如果我想知道某个酒吧当前是否处于打开状态,并且当前时间为04:00(星期一在星期二),这将导致当前酒吧关闭,因为它的星期二和关闭时间= 04:00
但是实际结果应该是,酒吧开放至05:00(星期一至星期二)
我有20多个酒吧的清单,我需要知道它们是当前打开还是关闭。 可以在mysql或php中完成吗? 我应该如何设置数据库表?
我将其作为当前设置
表名称:openhours字段:
id int(11)
bar_id int(11)
open_time time
close_time time
day tinyint(1)
表记录:
id: 1
bar_id: 1
open_time: 20:00:00
closed_time: 05:00:00
day: 0
id: 2
bar_id: 1
open_time: 20:00:00
closed_time: 04:00:00
day: 1
此查询适用于不超过午夜的开放日
SELECT `open_time`, `closed_time`, IF(CURTIME() BETWEEN `open_time`
AND `closed_time`,'open','closed') AS `status` FROM `openhours`
WHERE `day` = DATE_FORMAT(NOW(), '%w')
但是我该如何处理过去的午夜问题?
它尝试了这样的事情,但不是很正确
SELECT open_time, close_time, day, (CASE WHEN ((open_time <= close_time
AND open_time <= CURTIME() AND close_time >= CURTIME()) OR (open_time >= close_time
AND (CURTIME() <= close_time OR CURTIME() >= open_time))) THEN 'open' ELSE 'closed'
END) AS status FROM openhours WHERE bar_id = 2 and CASE WHEN (day = WEEKDAY(NOW())
AND (CURTIME() < open_time)) THEN CASE WHEN (day = (WEEKDAY(NOW()) - 1)
AND (CURTIME() < close_time)) THEN day = (WEEKDAY(NOW()) - 1)
ELSE day = WEEKDAY(NOW()) END ELSE day = WEEKDAY(NOW()) END
提前致谢!
您可以将UNIX_TIMESTAMP()用于此类问题:
SELECT `open_time`, `closed_time`, IF(UNIX_TIMESTAMP(CURTIME()) BETWEEN UNIX_TIMESTAMP(`open_time`) AND UNIX_TIMESTAMP(`closed_time`),'open','closed') AS `status` FROM `openhours` WHERE `day` = DATE_FORMAT(NOW(), '%w')
希望我明白你的意思:)
你想要这样的东西
case closed < open
not between open and closed
else
between open and closed
当任一返回true时,指示条打开
一种选择是将星期几后的秒数存储起来,这样就完全不必担心午夜了。
将它们添加到表中:
open_time_i int(11)
closed_time_i int(11)
并使您的数据如下所示:
id: 1
bar_id: 1
open_time: 20:00:00
open_time_i: 72000
closed_time: 05:00:00
closed_time_i: 104400
day: 0
id: 2
bar_id: 1
open_time: 20:00:00
open_time_i: 158400
closed_time: 04:00:00
closed_time_i: 187200
day: 1
然后您的查找可能类似于:
$seconds = time() - strtotime('this week last sunday', date("Y-m-d", time()))
SELECT `open_time`, `closed_time`, IF(
$seconds BETWEEN `open_time_i` AND `closed_time_i`
OR
(("closed_time_i" >= 604800 AND $seconds BETWEEN 0 AND ("closed_time_i" - 604800)))
,'open','closed') AS `status` FROM `openhours`
语句之间的第二个语句检查栏是否在该周更改之后打开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.