【发布时间】:2017-03-16 19:59:51
【问题描述】:
从数据库的角度来看,考虑以下因素的最佳实施/设计是什么:
无限重复的日历事件(无结束日期)?显然,为每个事件填充数据库记录是没有意义的!
创建重复事件后,编辑违反重复规则的单个事件的最佳方法是什么?例如,“每周一上午 9:00”,但有一个特定的星期一需要从上午 10:00 开始。
【问题讨论】:
标签: database-design calendar recurring-events
从数据库的角度来看,考虑以下因素的最佳实施/设计是什么:
无限重复的日历事件(无结束日期)?显然,为每个事件填充数据库记录是没有意义的!
创建重复事件后,编辑违反重复规则的单个事件的最佳方法是什么?例如,“每周一上午 9:00”,但有一个特定的星期一需要从上午 10:00 开始。
【问题讨论】:
标签: database-design calendar recurring-events
很难在完全没有细节的情况下建议对架构进行更改,但这是一种方法。你所拥有的是一个条目,上面写着“从这个日期开始,会议时间在这一天的这个时间。”
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 点。
我添加了星期几,但如果您知道会议绝对总是在星期一举行,您可以将其省略。
【讨论】: