如何查询数据库表中存储为iCal RRULE的循环约会



如果我有一个包含以下列的约会表,我如何查询规则以提取在特定日期或两个日期之间发生的约会?

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中做到这一点,你必须分两步完成。

  1. 查询dt_start在2016-10-10之前,dt_end在2016-10-10之后的所有事件。
  2. 丢弃所有在2016-10-10不会发生的事件,因为它们的规则(例如BYDAY)。为此,您需要一个库(例如ICAL.net),可以快速计算rrule字段的出现次数。

我建议你缓存结果一旦完成,所以对于任何后续查询,你将能够读取缓存2016-10-10,而不是再次进行计算。当dt_startdt_end之间包含2016-10-10的事件被添加、更新或删除时,您必须处理使缓存无效的问题。

如果您有很多重复事件,那么数据库和应用程序要做很多工作。在我编写的日历应用程序中,我在创建事件时扩展了规则,并将每个重复事件放在单独的行中。我添加了一个唯一id字段(icalendar规范中的UID,与id字段分开),这样我就可以在需要时在查询中将重复事件分组在一起(重复系列中的每个事件都具有相同的唯一id)。然后,使用标准查询搜索日期就很容易了。它还可以更容易地避免在规则中包含异常,这些异常在数据库中没有行。

最新更新