如果我有一个包含以下列的约会表,我如何查询规则以提取在特定日期或两个日期之间发生的约会?
Appointments
------
id
name
dt_start
dt_end
rrule
例如,假设我有一个约会,从2016-09-28开始,到2017-04-28结束,每两周在周一、周五发生一次,直到2017年4月28日。以下是RRule:
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20170428T230000Z;BYDAY=MO,FR EXDATE:20170414T023000Z
因此,使用上面的例子,上述约会发生的一些日期将包括以下内容:
2016-09-30 FRI
2016-10-10 MO
2016-10-14 FRI
2016-10-24 MO
现在我如何使用SQL或任何其他方法查询这个表,以提取所有发生在2016-10-10的约会?
对于记录,这将在c# asp.net和SQL server中完成。是否有一个c#或SQL Server库,我可以用它来解析和查询规则?
我看了一下ICAL.net,但似乎没有太多关于它的文档,也没有关于我如何使用它来达到上面解释的目的。
有人有使用ICAL.net的经验吗?
有人有使用ICAL.net的经验吗?
不,但我是php-rrule的作者,我想我的答案也适用于你的情况。
让我们开始说,除非你有一组非常有限的规则,例如,你知道没有一个事件是无限的,或者重复超过X次等等,在存储之前扩展规则是行不通的。
据我所知,你不能只在SQL中做到这一点,你必须分两步完成。
- 查询
dt_start
在2016-10-10之前,dt_end
在2016-10-10之后的所有事件。 - 丢弃所有在2016-10-10不会发生的事件,因为它们的规则(例如
BYDAY
)。为此,您需要一个库(例如ICAL.net),可以快速计算rrule
字段的出现次数。
我建议你缓存结果一旦完成,所以对于任何后续查询,你将能够读取缓存2016-10-10,而不是再次进行计算。当dt_start
和dt_end
之间包含2016-10-10的事件被添加、更新或删除时,您必须处理使缓存无效的问题。
如果您有很多重复事件,那么数据库和应用程序要做很多工作。在我编写的日历应用程序中,我在创建事件时扩展了规则,并将每个重复事件放在单独的行中。我添加了一个唯一id字段(icalendar规范中的UID,与id字段分开),这样我就可以在需要时在查询中将重复事件分组在一起(重复系列中的每个事件都具有相同的唯一id)。然后,使用标准查询搜索日期就很容易了。它还可以更容易地避免在规则中包含异常,这些异常在数据库中没有行。