【问题标题】:A way to store opening hours in order to determine whether a place is open now一种存储营业时间以确定某个地方现在是否营业的方法
【发布时间】:2018-08-27 14:02:09
【问题描述】:

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

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

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

我不确定我将如何处理翻转时间,例如确定餐厅是否会在周六晚上 11:55 从现在开始营业 45 分钟。

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

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 个周期是有意义的,但除此之外我不知道该怎么做。

【问题讨论】:

  • 其实很明显,打烊时间比开门时间晚(而且这些餐厅从来都不是24小时营业的),所以你可以按原样存放(没有+1) .或者,如果这样更有意义,您可以存储开放时间和持续时间。

标签: php mysql database schema


【解决方案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 中可能有更优雅的表达方式 - 或者在应用程序代码中处理位解码可能更智能,

【讨论】:

  • 位码是什么?而对于第二排,我是否知道因为关门时间小于开门时间,所以关门时间是第二天?如果我这样存储,现在是星期六凌晨 2 点,那么我需要查看星期五的营业时间吗?
  • 你想回答什么问题?
  • 给定该场所的营业时间,判断当前时间是否在营业前15分钟和关闭前45分钟内。由于翻转,我不确定如何存储/计算它。
  • 看起来不错,我现在正在尝试实现它。我没有意识到你可以用 SQL 做这样的事情。
  • 星期天 02:00:00 不起作用,我说得对吗?
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多