具有无穷大的重复日历事件的数据库设计

时间:2017-03-16 19:59:52

标签: database-design calendar recurring-events

从数据库的角度来看,考虑以下因素的最佳实施/设计是什么:

  1. 重复发生的无限日历事件(没有结束日期)?显然,为每个事件填充数据库记录是没有意义的!

  2. 在创建重复出现的事件后,编辑单个事件以打破重复规则的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的星期一需要在上午10:00开始。

1 个答案:

答案 0 :(得分:0)

很难建议完全没有细节的架构更改,但这是一种方法。你所拥有的是一个条目,说“从这个日期开始,会议时间就在这个时候。”

EffDate    DOW   Time
01/01/2017 Mon   0900
03/14/2017 Mon   1000
03/21/2017 Mon   0900

从1月1日的日程安排的第一天开始,会议将于周一上午9点​​举行。然后,从星期二开始生效,下周一(20日)的会议将在上午10点开始。从21日开始,会议时间将恢复到上午9点。

使这项工作的查询看起来有点复杂,但遵循逻辑,它应该是显而易见的。

select  Dow "Day of meeting", Time
from    MeetingSchedule ms
where   ms.EffDate =(
        select  Max( ms1.EffDate )
        from    MeetingSchedule ms1
        where   ms1.EffDate <= Today()
        );

如果此查询在1月1日或之后3月14日(即周二)之前的任何时间执行,则返回将在周一上午9点​​显示。从第二天开始,整整一周,返回将在周一上午10点显示。然后从第二天开始(从那时开始),时间将再次显示在上午9点。

当然,您可能想知道在任何给定的星期一会议时间。日期将进入一个变量,该变量将替换返回执行日期的函数。

select  :DateOfInterest "Week starting", Dow "Day of meeting", Time
from    MeetingSchedule ms
where   ms.EffDate =(
        select  Max( ms1.EffDate )
        from    MeetingSchedule ms1
        where   ms1.EffDate <= :DateOfInterest
        );

假设你经历了一个循环,产生了连续星期日的日期,那么3月份的输出就像这样:

Week starting   Day of meeting Time
   03/05/2017   Mon            0900
   03/12/2017   Mon            0900
   03/19/2017   Mon            1000
   03/26/2017   Mon            0900

但是,在更改会议日期之前的最后一次会议之后的任何日期都将给出正确的答案。如果时间从那时开始改为上午10点,只需消除最后一行,将其恢复为早上9点。

我添加了星期几,但如果您知道会议绝对会在星期一结束,那么您可以将其保留。