如果我有一个包含以下列的约会表,我如何查询规则以提取在特定日期或两个日期之间发生的约会?
Appointments
------
id
name
dt_start
dt_end
rrule
例如,假设我有一个约会,从 2016 年 9 月 28 日开始,到 2017 年 4 月 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 库可用于解析和查询 rrule?
我看过ICAL.net但似乎没有太多关于它的文档,或者我如何将它用于上述目的。
有人有使用 ICAL.net 的经验吗?
最佳答案
Does any one have any experience with ICAL.net?
不是,但我是 php-rrule 的作者我认为我的答案也适用于您的情况。
首先我们要说的是,除非您有一组非常有限的规则,并且您知道,例如,没有事件永远不会是无限的,或者重复超过 X 次或其他什么,否则在存储之前扩展规则是不会发生的去工作。
据我所知,你不能只用SQL来完成,你必须分两步完成。
- 查询
dt_start
为2016-10-10之前,dt_end
为2016-10-10之后的所有事件。 - 丢弃所有因规则而不会在 2016 年 10 月 10 日发生的事件(例如
BYDAY
)。为此,您需要一个可以快速计算rrule
字段中出现次数的库(我猜是 ICAL.net)。
我建议您在完成此操作后缓存结果,因此对于任何后续查询,您将能够读取 2016 年 10 月 10 日的缓存,而不用再次进行计算。每当添加、更新或删除 dt_start
和 dt_end
之间包含 2016-10-10 的事件时,您都必须注意使缓存失效。
关于jquery - 如何查询数据库表中存储为 iCal RRULE 的定期约会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754097/