【问题标题】:How to store a recurring time window如何存储循环时间窗口
【发布时间】:2026-01-03 23:35:01
【问题描述】:

存储循环时间窗口的首选方式是什么?
例如。如果我有一个日历系统,我需要能够容纳每天、每周或每月重复发生的事件,那么哪种时间管理系统最好?

这在数据库中如何最好地表示?

更多详情
这样做的具体目标是提供一组开放时间窗口。一旦我们有了这些时间窗口,代码就需要测试到达系统的消息是否在其中一个时间窗口内。

【问题讨论】:

    标签: database timezone


    【解决方案1】:

    我将创建一个 RecurrenceType 表,该表将保存您的日历系统支持的每种重复类型的记录。 CalendarEvents 表中的每个事件都会引用 RecurrenceType 表中的 ID。

    然后,我将在代码中包含一个 RecurrenceRules 对象,该对象将保存计算何时将给定下一个日期为当前日期或开始日期或检索下一个 N 日期作为数组的业务逻辑。

    大多数重复逻辑可能必须根据基于 RecurrenceType 表 ID 的枚举值进行编码。如果你可以让它全部由数据驱动,我会感到惊讶,除非它是一个非常简单的日历系统。

    希望对您有所帮助。这听起来像是一个有趣的项目。

    【讨论】:

      【解决方案2】:

      这延迟了很长时间,但经过多次测试和许多心痛,我们决定采用某种方案来完成这项工作。为了我们系统的需要,我们只需要每周重复一次(如果有的话)。最终产品将被设计成这样。

      这是数据库架构

      id : int(10)
      window_name : varchar(100)
      start_date : datetime
      end_date : datetime
      start_time : time
      duration : int(10)
      timezone: varchar(100)
      monday : tinyint(1)
      tuesday : tinyint(1)
      ...
      sunday : tinyint(1)
      
      1. 每个时间“窗口”都有一个设定的开始日期、结束日期、开始时间和持续时间。
      2. 窗口将在开始日期和开始时间打开并运行“duration”秒
      3. 该窗口仅在一周中的指定日期打开

      这是唯一允许窗户每周打开和关闭的系统,并且窗户可以跨越到第二天早上。我确信有更复杂的系统可以执行重复窗口,但我们正在寻找灵活且快速的系统,并且不需要每月重复事件或每年事件。

      【讨论】: