从数据库的角度来看,考虑以下因素的最佳实施/设计是什么:
重复发生的无限日历事件(没有结束日期)?显然,为每个事件填充数据库记录是没有意义的!
在创建重复出现的事件后,编辑单个事件以打破重复规则的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的星期一需要在上午10:00开始。
答案 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点。
我添加了星期几,但如果您知道会议绝对会在星期一结束,那么您可以将其保留。