如何在一天中为多个企业存储多个小时范围

时间:2017-12-03 21:00:30

标签: mysql datetime

我发现了很多关于这个主题的问题,但是很多问题似乎并没有在一天内解决多个小时集。目前我有一周的每一天的收盘时间和开盘时间变量。我的问题是那些说从早上8点到下午2点,下午5点到晚上11点开放的商家,或类似的东西。我最接近的是一周的每一天的字符串变量格式如下:“08:00-14:00; 17:00-23:00”然后只用分号分隔然后破折号和我会有我的套装。但是我已经读过你一般都不希望将时间存储为字符串。这有什么问题?或者是否有更好的方法来存储和处理一天中的多个时间段。

编辑:

我有一个代表特定市场区域的表格,此表中的每个条目都是一个不同的餐厅,其中包含有关它们的各种信息:GPS坐标,地址,电话号码,开放/关闭时间等。目前我有14个时间戳列开闭时间;一周中的每一天都有一个开放和一个结束。我已经编写了一个算法,以确定一个地方是否开放,即使在午夜后关闭一个地方,也只需要通过开始和结束时间。我正在寻找一种可能在一天内存储多个时间集的解决方案。

3 个答案:

答案 0 :(得分:2)

您认为不应将时间存储为数据库中的字符串是正确的;你应该将它们存储为 DATE (也包括时间)。理想情况下,您要做的是为start time添加一列,为closing time添加另一列。每个日期都有。

然后您将计算两个服务器端之间的差异。

考虑到您正在处理大量,我实际上建议您使用辅助表(在我的示例中称为Hours)。让您的日期映射到Days表中设置“范围”,并将这些时间与Hours表中的特定时间相关联。

在以下示例中,Hours中的Days字段与ID的主键Hours相关联:

ID |    Name   | Hours
----------------------
1  |   Monday  |   1
2  |  Tuesday  |   2
3  | Wednesday |   2

小时

ID |    Start   |     End   
---------------------------
1  |   08:00:00 |  18:00:00
2  |   10:00:00 |  20:00:00

修改

如果您每天多次打开和关闭,则需要切换表格,并使Hours表格显示哪些日期包含这些小时数:

小时

ID |    Start   |     End   |   Day 
-------------------------------------
1  |   08:00:00 |  10:00:00 |    1 
2  |   12:00:00 |  14:00:00 |    1 
3  |   10:00:00 |  20:00:00 |    2   

ID |    Name   
---------------
1  |   Monday
2  |  Tuesday
3  | Wednesday

希望这会有所帮助:)

答案 1 :(得分:1)

我建议你为小时集创建一个单独的关系。我无法为您提供确切的代码,但总体思路如下:

CREATE TABLE day_of_a_week (
    day_name TEXT UNIQUE NOT NULL;

    CONSTRAINT PK_day_of_a_week_day_name PRIMARY KEY (day_name);
);

CREATE TABLE time_period (
    day_of_a_week_name TEXT;

    start_time TIMESTAMP NOT NULL;
    end_time   TIMESTAMP NOT NULL;

    CONSTRAINT FK_day_of_a_week_time_period FOREIGN KEY (day_of_a_week_name)
        REFERENCES day_of_a_week (day_name)
        MATCH FULL
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

建议解决方案的一个简洁功能是,您可以使用相同的time_period关系来定义某些特定日期的特殊工作时间。

这样您就可以为每一天定义多个时间段。但是,这种解决方案有一个明显的缺点 - 数据重复。可以为多天定义相同的时间段。

可以使用day_of_a_weektime_period之间的多对多链接解决此问题。但我不确定这是否是解决这个问题的好方法。

答案 2 :(得分:0)

这里的答案与我的需求很接近,但我把它们与我在Google上找到的其他东西结合起来。我出错的地方没有考虑多个表格。我假设,因为这是与我原始表中的业务有关的数据,小时应该在同一个表中。我的最终结果是一个单独的小时表,其中包含业务ID,星期几,开放时间和结束时间的列。然后,当拉动小时数时,我会拉出包含业务ID和所需星期几的所有行。这支持一天所需的时间帧,并允许我以仍然适用于我当前算法的方式提取数据。