【问题标题】:mysql open hours past midnightmysql 午夜过后的营业时间
【发布时间】:2013-11-07 17:43:47
【问题描述】:

我正在构建一个 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中完成吗?我应该如何设置我的数据库表?

我有这个作为我当前的设置

餐桌名称:营业时间 字段:

 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 函数来解决这些问题:

标签: php mysql database time


【解决方案1】:

您可以使用 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')

希望我能明白你的意思:)

【讨论】:

  • UNIX_TIMESTAMP(open_time) 或 UNIX_TIMESTAMP(close_time) 都返回 0
【解决方案2】:

你想要这样的东西

case closed < open
 not between open and closed
else 
 between open and closed 

当任一返回 true 时,栏是打开的

【讨论】:

  • 问题在于获得正确的打开和关闭时间。如果酒吧在周一营业到周二凌晨 5 点,那么我必须采用周一的营业时间而不是周二。那么我要以另一种方式设置我的数据库吗?我不知道是怎么回事
【解决方案3】:

一种选择是存储一周开始之后的秒数,这样您就完全不用担心午夜了。

将这些添加到您的表中:

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`

第二个 between 语句检查栏是否在该周更改之后打开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2016-01-13
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多