比方说,我维护着一个事件数据库,这个数据库可以是企业每周工作时间(星期一至星期五:上午10点至下午7点,星期六:下午12点至下午6点,星期日:休息)每月事件(艺术公平,每月第一个星期六,上午10点 - 下午5点),以每年一度的盛事(圣诞夜慈善晚宴,7 PM-9PM)在数据库中,如何存储快速/优雅查询的事件发生日期和时间范围?
在理想情况下,我愿与任何一天来查询数据库,说: 周四,2012年1月12日,中午12时
...,发现都在发生的所有事件:
- 经常中午周四(如业务是开放的)
- 每月第二个星期四(艺术博览会)
- 1月12日,具体为(呃......土库曼斯坦纪念日)
我猜想没有先考虑如何将这样的日期/时间存储在数据库中,谈论查询构造就毫无意义。
我无法想象每周正常运行时间的概念(即使忽略边缘情况)可以用一个单一记录的单个字段进行建模,该字段还将建立一年一度的事件模型。最起码,好像我至少需要五个领域:
- 启动时间
- 时间
- 日的一周内(如星期一星期二等)
- 可选绝对每年的日期(例如5月8日)
- 可选每月发生(第四星期三)
而且我猜有没有办法在单排封装,对吗?例如,每个工作日开放的业务将有五个记录。
而最终目标是能够做一个相对优雅的查询,可以查找包含其时间范围内给定时刻的所有事件记录。
是否需要将所有事件存储到一个表中? – Rogach 2012-01-14 18:00:40
不一定。我现在在想,把常规工作如常规工作时间放在一个单独的表格中,并使用单独的字段更有意义。我抱着希望,有一个按位解决所有这些问题 – Zando 2012-01-14 20:02:14
@Zando:按位解决方案是可能的,例如['cron.c'](http://opensource.apple.com/source/cron/cron-2 /cron/cron.c),但你不需要它:范围查询可以是有效的(对于索引边界或R *树索引,O(log(N)) – jfs 2012-01-15 01:56:02