【发布时间】:2012-01-14 16:23:37
【问题描述】:
假设我正在维护一个事件数据库,它可以是从企业营业时间(周一至周五:上午 10 点至晚上 7 点,周六:12 点至下午 6 点,周日:休息)的每周计划到每月的活动(艺术博览会,每个第一个星期六,上午 10 点至下午 5 点)到年度活动(平安夜慈善晚宴,晚上 7 点至晚上 9 点)
在理想情况下,我想查询任何一天的数据库,比如: 2012 年 1 月 12 日星期四下午 12 点
...并找到所有发生的事件:
- 一个常规的星期四中午(例如营业中)
- 每个第二个星期四(艺术博览会)
- 一月。 12,特别是(呃......土库曼斯坦阵亡将士纪念日)
如果不首先考虑如何将此类日期/时间存储在数据库中,我想讨论查询构造是没有意义的。
我无法想象如何在一个记录单一的字段中建模每周定期工作时间(即使忽略极端情况)的概念,该字段也可以建模每年一次的事件。至少,我似乎至少需要五个字段:
- 开始时间
- 持续时间
- 星期几(例如周一、周二等)
- 可选的绝对年度日期(例如 5 月 8 日)
- 可选的每月发生(第四个星期三)
而且我猜没有办法将它封装在一行中,对吧?例如,每个工作日营业的企业将有 5 条记录。
最终目标是能够进行一个相对优雅的查询,可以找到所有在其时间范围内包含给定时刻的事件记录。
【问题讨论】:
-
是否需要将所有事件存储到一个表中?
-
不一定。我现在在想,将日常事务(例如正常营业时间)保存在单独的表格中并具有单独的字段更有意义。我一直希望有一个按位解决所有这些问题
-
@Zando:按位解决方案是可能的,例如,
cron.c,但您不应该需要它:范围查询可以是高效的(O(log(N) 用于索引边界或 R*Tree 索引)。 -
OpenTSDB?还是您正在寻找更多类似 Cron 之类的东西使用的日历队列之类的东西?
标签: algorithm database-design datetime language-agnostic