2017-03-16 66 views
1

从数据库的角度来看,什么是最好的实现/设计考虑以下几点:数据库设计为定期日历事件具有无穷

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

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

回答

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() 
     ); 

如果该查询仅仅是3月14日(这是一个星期二)前执行任何时间1月1日或之后,回报率将在周一上午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 
     ); 

假设你通过一个循环生成连续周日的日期,输出应该是这样的三月份:

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点。

我添加了星期几,但如果您知道会议绝对会始终在星期一,您可以不发表。