一种存储营业时间的方法,以确定一个地方现在是否营业

时间:2018-08-26 10:14:25

标签: php mysql database schema

我希望能够存储多家餐厅的营业时间,并确定一家商店现在是否营业,但是我一直在如何处理午夜后关闭的地方。

  

以下是餐厅营业时间的示例:

Monday: 6:00AM-10:00PM
Tuesday: 6:00AM-10:00PM
Wednesday: 6:00AM-10:00PM
Thursday: 6:00AM-10:00PM
Friday: 6:00AM-11:59PM
Saturday: 0:00AM-3:00AM, 6:00AM-11:59PM
Sunday: 0:00AM-3:00AM, 6:00AM-10:00PM

我不确定我应该使用哪种类型的模式来表示这一点,这种方式可以让我确定某个餐厅现在是否开放。

设置了架构后,我的目标是能够为任何特定的餐厅确定以下内容:

  • 餐厅是否将从现在开始15分钟营业
  • 餐厅是否将从现在开始关闭45分钟

因此,如果当前时间是餐厅营业前15分钟,则应将餐厅视为已营业;如果当前时间是营业时间之前45分钟,则应将餐厅视为已营业,并且在此之间的任何时间都应视为营业时间,考虑到午夜的翻转。

所以这是一些预期的输入和结果:

Restaurant 1
Monday: 6:00AM-10:00PM
Tuesday: 6:00AM-10:00PM
Wednesday: 6:00AM-10:00PM
Thursday: 6:00AM-10:00PM
Friday: 6:00AM-11:59PM
Saturday: 0:00AM-3:00AM, 6:00AM-11:59PM
Sunday: 0:00AM-3:00AM, 6:00AM-10:00PM

Current day/time -> Result
Monday 12:00PM -> Open
Monday 2:00AM -> Closed
Monday 5:45AM -> Open
Monday 9:30PM -> Closed
Saturday 4:00AM -> Closed
Saturday 11:55PM -> Open
Sunday 2:00AM -> Open
Sunday 2:25AM -> Closed

我不确定如何处理转存时间,例如确定餐厅是否从现在起的45分钟(星期六)晚上11:55营业。

  

这是餐厅营业时间的另一个示例:

Monday: 10:00AM-10:00PM
Tuesday: 10:00AM-10:00PM
Wednesday: 10:00AM-10:00PM
Thursday: 10:00AM-10:00PM
Friday: 10:00AM-11:59PM
Saturday: 0:00AM-11:59PM
Sunday: 0:00AM-9:00PM

商店在星期六营业24小时,所以我也必须能够处理这种情况。

  

餐厅可能会24/7全天营业:

Monday: 0:00AM-11:59PM
Tuesday: 0:00AM-11:59PM
Wednesday: 0:00AM-11:59PM
Thursday: 0:00AM-11:59PM
Friday: 0:00AM-11:59PM
Saturday: 0:00AM-11:59PM
Sunday: 0:00AM-11:59PM
  

餐厅每天可能有0、1、2或更多时段:

Monday: CLOSED
Tuesday: CLOSED
Wednesday: 10:00AM-2:00PM, 5:00PM-10:00PM
Thursday: 10:00AM-2:00PM, 5:00PM-10:00PM
Friday: 10:00AM-2:00PM, 5:00PM-11:59PM
Saturday: 0:00AM-3:00AM, 10:00AM-2:00PM, 5:00PM-11:59PM
Sunday: 0:00AM-3:00AM, 10:00AM-2:00PM, 5:00PM-9:00PM

所以我的目标是针对给定的餐厅及其营业时间查找当前时间是否在以下时间之间:

  • 开门前15分钟,和
  • 关闭前45分钟,
  • 当天的任何时段

并找到一种很好的方式来存储信息,以便可以确定多个餐厅的信息。

因为每天可能有0个或多个期间,所以我认为每行存储1个期间是有意义的,但是除此之外,我不确定该怎么做。

1 个答案:

答案 0 :(得分:1)

我想我可能会这样存储它:

bit_code opens    closes
69       06:00:00 22:00:00 
48       06:00:00 03:00:00

我用数字表示了星期几,如下所示:

Monday    -  1
Tuesday   -  2
Wednesday -  4
Thursday  -  8
Friday    - 16
Saturday  - 32
Sunday    - 64

所以,星期五+星期六= 48

编辑:

考虑以下示例:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(weekday_code INT NOT NULL
,opens TIME NOT NULL
,closes TIME NOT NULL
);

INSERT INTO my_table VALUES
(69,'06:00:00','22:00:00'),
(48,'06:00:00','03:00:00');

现在23:30:00。我认为以下内容可以告诉我们餐厅目前在一周的哪几天营业(并考虑15分钟和45分钟的规则)...

SELECT *  
  FROM my_table 
 WHERE CAST('23:30:00' AS TIME) >= opens - INTERVAL 15 MINUTE
   AND CAST('23:30:00' AS TIME) <= (CASE WHEN closes < opens THEN closes + INTERVAL 24 HOUR ELSE closes END) - INTERVAL 45 MINUTE; 

+--------------+----------+----------+
| weekday_code | opens    | closes   |
+--------------+----------+----------+
|           48 | 06:00:00 | 03:00:00 |
+--------------+----------+----------+ 

我们可以在应用程序代码或SQL中引入其他技巧,以解释一周中的哪几天是“ 48”。同样,我们不必这样存储星期几;它看起来似乎非常紧凑,尤其是在有很多餐厅(营业时间相当稳定)的情况下。

无论如何,如果采用这种方法...只是为了娱乐/完整性...

SELECT a.x 
FROM 
   ( SELECT  1 x UNION
     SELECT  2 UNION
     SELECT  4 UNION
     SELECT  8 UNION
     SELECT 16 UNION
     SELECT 32 UNION
     SELECT 64 
   ) a
JOIN my_table b
  ON a.x = ( a.x & b.weekday_code) 
 AND CAST('23:30:00' AS TIME) >= b.opens - INTERVAL 15 MINUTE
 AND CAST('23:30:00' AS TIME) <= (CASE WHEN b.closes < b.opens THEN b.closes + INTERVAL 24 HOUR ELSE b.closes END) - INTERVAL 45 MINUTE; 

 +----+
 | x  |
 +----+
 | 16 |
 | 32 |
 +----+

我们可以从中推断出,如果今天是星期五或星期六,那么餐厅就营业。

请注意,在SQL中可能有一种更优雅的表达方式-或者处理应用程序代码中的位解码可能更聪明,