我发现了很多关于这个主题的问题,但是很多问题似乎并没有在一天内解决多个小时集。目前我有一周的每一天的收盘时间和开盘时间变量。我的问题是那些说从早上8点到下午2点,下午5点到晚上11点开放的商家,或类似的东西。我最接近的是一周的每一天的字符串变量格式如下:“08:00-14:00; 17:00-23:00”然后只用分号分隔然后破折号和我会有我的套装。但是我已经读过你一般都不希望将时间存储为字符串。这有什么问题?或者是否有更好的方法来存储和处理一天中的多个时间段。
编辑:
我有一个代表特定市场区域的表格,此表中的每个条目都是一个不同的餐厅,其中包含有关它们的各种信息:GPS坐标,地址,电话号码,开放/关闭时间等。目前我有14个时间戳列开闭时间;一周中的每一天都有一个开放和一个结束。我已经编写了一个算法,以确定一个地方是否开放,即使在午夜后关闭一个地方,也只需要通过开始和结束时间。我正在寻找一种可能在一天内存储多个时间集的解决方案。
答案 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_week
和time_period
之间的多对多链接解决此问题。但我不确定这是否是解决这个问题的好方法。
答案 2 :(得分:0)
这里的答案与我的需求很接近,但我把它们与我在Google上找到的其他东西结合起来。我出错的地方没有考虑多个表格。我假设,因为这是与我原始表中的业务有关的数据,小时应该在同一个表中。我的最终结果是一个单独的小时表,其中包含业务ID,星期几,开放时间和结束时间的列。然后,当拉动小时数时,我会拉出包含业务ID和所需星期几的所有行。这支持一天所需的时间帧,并允许我以仍然适用于我当前算法的方式提取数据。