如何使用开始和结束时间计算空闲时间块?

时间:2011-03-25 12:24:20

标签: sql ruby-on-rails ruby time

我有一个使用MySQL的Ruby on Rails应用程序,我需要计算一个具有开始和结束日期时间行的表的空闲(可用)时间块。这需要针对一系列日期进行,例如,我需要查看5月1日到5月7日之间哪些时间是免费的。我可以使用不可用的时间查询表并使用它来删除句点5月1日至5月7日之间的时间。数据库中的时间以四分之一小时的保真度存储15分钟,这意味着所有时间都在00,15,30或45分钟结束。从来没有像11:16或10:01这样的时间,所以不需要四舍五入。

我考虑创建一个散列,其时间以15分钟为增量表示,并将所有值默认为“available”(1),然后迭代行的有序结果集并将散列中的值翻转为0从数据库回来的时间。我不确定这是否是最有效的方法,我有点担心该方法的内存利用率和计算强度。这种计算不会一直发生,但它需要扩展到每天至少发生几百次。看起来我还需要重新处理整个哈希以找到在此之后可用的时间块,这似乎效率很低。

有关更好方法的任何想法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

我已经做了几个这样的事情。首先,我的假设是你的表显示约会,现在你想得到一个未预订的时间列表,对吗?

所以,我这样做的第一种方式就像你的,只是未使用时间的哈希。它很慢,有限,有点浪费,因为每当有人需要知道可用的时间时我就必须重新计算哈希值。

我这样做的另一种方式是借用数据仓库人员的想法。我构建了一个我感兴趣的所有时隙的属性表。如果你构建这种表,你可能想在插槽时间之外添加更多信息。你可能还会包括周末,一天中的哪个小时,是否在正常工作时间,是否在度假,等等。然后,我必须在开始和结束时间之间连接所有插槽,并且我的约会为空。所以,这是LEFT JOIN,类似于:

SELECT * 
FROM slots 
WHERE ... 
  LEFT JOIN appointments 
    WHERE appointments.id IS NULL

这使我不必每次都重新创建哈希,并且它使用数据库来执行set操作,这是数据库优化的功能。

另外,如果你让你的老虎机表变得有点富裕,你可以开始做各种各样的询问,不仅可以查看你可能使用的可用插槽,还可以查看往往会被预订的各种时间,或种类有时可能总是可用的时间,或者你可能想要回答的其他有趣的问题。至少,您应该跟踪告诉您插槽是否应该被填充的字段(如营业时间)。

答案 1 :(得分:0)

为什么行中没有标志来指示这一点。分配时间后,在适当范围内的每个日期/时间翻转标志。例如,5月2日,中午12点到下午1点,将被标记为不可用。

然后,查询可用性标记设置为true的每一行的日期范围都很简单。