从数据库的角度来看,什么是最好的实现/设计考虑以下几点:数据库设计为定期日历事件具有无穷
定期日历是无限的(没有结束日期)事件?显然,为每个事件填充数据库记录是没有意义的!
创建周期性事件之后,编辑单个事件以打破重复性规则的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的星期一需要在上午10:00开始。
从数据库的角度来看,什么是最好的实现/设计考虑以下几点:数据库设计为定期日历事件具有无穷
定期日历是无限的(没有结束日期)事件?显然,为每个事件填充数据库记录是没有意义的!
创建周期性事件之后,编辑单个事件以打破重复性规则的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的星期一需要在上午10:00开始。
很难在绝对没有细节的情况下建议更改架构,但这里有一种方法。你所拥有的是一个条目,“从这个日期开始,会议时间就在这一天。”
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点。
我添加了星期几,但如果您知道会议绝对会始终在星期一,您可以不发表。