是否有一种规范的方法来存储数据以帮助计算下一次重复操作何时发生?
Is there a canonical way for storing data to assist in calculating when a recurring operation should next take place?
我正在编写一个实用程序来配置何时自动生成某些报告。
下一部分将是一些后台任务(可能是 Windows 服务),它将轮询数据库以了解何时执行这些重复操作。我想出了这个初始 table 设计:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
RunWhen DateTime
...但很快意识到 "RunWhen" 不会削减番茄酱,因为对于给定会员,给定报告需要多次 运行(一旦 运行s,值就不再是 valid/useful).
不过,在展示下一个候选 table 设计之前,先说说何时可以完成这些报告(生成并通过电子邮件发送):配置者可以将它们设置为 运行每个月的第几天(第 1 天、第 10 天、第 17 天,等等)或根据模式,即它们可以设置为 "the first Tuesday of each month" 或 "the last Friday of each month" 或 "the first Monday of each week"(IOW,每逢星期一)。所以我想到了这个:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
...但后来意识到这也没有多大意义,因为代码必须 运行 计算是否已达到等同于 DayOfMonth 或 Pattern 字段组合的任何日期或每次轮询数据库时都超过。那么什么会阻止它在那之后永远触发呢?
所以,我想我需要结合这些想法,但不是 RunWhen,而是调用 DateTime 字段 NextExecution,并在每次为给定成员生成报告时更新它:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
NextExecution DateTime
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
当达到或超过 NextExecution 时间时,服务 generates/emails 报告。然后计算下一次执行的时间(基于 DayOfMonth 或 Pattern* 字段)并使用该值更新 NextExecution 字段。
这对我来说似乎是合乎逻辑的,但我确信这是一个以前遇到过的挑战,并且想知道是否有一种标准的方法来完成这个可能比我提出的方法更清晰。
假设您记录了这些报告何时 运行,您可以将其与第二种方法一起使用,以防止报告多次 运行ning。您可能想要合并某种规则,您将只尝试 运行 已在 "X" 天内过期的报告。
另一种可能的设计是保持与您的第一种方法相似的 table,但是当有人在接下来的 10 年(或其他足够大的时间跨度)中创建新的时间表时填写它.保留一个 table 列出用户创建的计划和 link 计划日期返回到这些计划,以便您可以在用户取消计划时删除它们。您需要决定如何处理重叠的时间表(例如,两个时间表恰好在本月的同一天登陆,并且要求相同的报告为 运行)。你运行举报过一次还是两次?当用户 creates/deletes 安排时,您如何处理它决定了您可能必须如何围绕维护日历进行编码。
我正在编写一个实用程序来配置何时自动生成某些报告。
下一部分将是一些后台任务(可能是 Windows 服务),它将轮询数据库以了解何时执行这些重复操作。我想出了这个初始 table 设计:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
RunWhen DateTime
...但很快意识到 "RunWhen" 不会削减番茄酱,因为对于给定会员,给定报告需要多次 运行(一旦 运行s,值就不再是 valid/useful).
不过,在展示下一个候选 table 设计之前,先说说何时可以完成这些报告(生成并通过电子邮件发送):配置者可以将它们设置为 运行每个月的第几天(第 1 天、第 10 天、第 17 天,等等)或根据模式,即它们可以设置为 "the first Tuesday of each month" 或 "the last Friday of each month" 或 "the first Monday of each week"(IOW,每逢星期一)。所以我想到了这个:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
...但后来意识到这也没有多大意义,因为代码必须 运行 计算是否已达到等同于 DayOfMonth 或 Pattern 字段组合的任何日期或每次轮询数据库时都超过。那么什么会阻止它在那之后永远触发呢?
所以,我想我需要结合这些想法,但不是 RunWhen,而是调用 DateTime 字段 NextExecution,并在每次为给定成员生成报告时更新它:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
NextExecution DateTime
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
当达到或超过 NextExecution 时间时,服务 generates/emails 报告。然后计算下一次执行的时间(基于 DayOfMonth 或 Pattern* 字段)并使用该值更新 NextExecution 字段。
这对我来说似乎是合乎逻辑的,但我确信这是一个以前遇到过的挑战,并且想知道是否有一种标准的方法来完成这个可能比我提出的方法更清晰。
假设您记录了这些报告何时 运行,您可以将其与第二种方法一起使用,以防止报告多次 运行ning。您可能想要合并某种规则,您将只尝试 运行 已在 "X" 天内过期的报告。
另一种可能的设计是保持与您的第一种方法相似的 table,但是当有人在接下来的 10 年(或其他足够大的时间跨度)中创建新的时间表时填写它.保留一个 table 列出用户创建的计划和 link 计划日期返回到这些计划,以便您可以在用户取消计划时删除它们。您需要决定如何处理重叠的时间表(例如,两个时间表恰好在本月的同一天登陆,并且要求相同的报告为 运行)。你运行举报过一次还是两次?当用户 creates/deletes 安排时,您如何处理它决定了您可能必须如何围绕维护日历进行编码。