在数据库中存储复杂的时间间隔

2024-05-16 10:41:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个可以处理事件的应用程序。(语言:python2.7,RDBMS:PostgreSQL,CSM:Django 1.9.6)。我需要存储有关日历事件的信息。它们具有高度可定制的时间间隔(例如:每周四从3月5日5:00开始重复5次,持续45分钟;或每月的每一天下午6:00重复,持续时间为1天2小时(从下午1:00到下午2:00,然后从下午3:00到下午4:00)。在

问题是如何存储这类信息,并快速选择实际事件(在当前和将来的特定时刻活动)?在

作为一个解决办法:使用RRule和定期工作来计算第二天每个事件的时间间隔。但是,我认为这是一个非常耗时的操作,特别是如果服务器上有数千个事件(缓存有帮助,但是当我需要将来特定时刻的活动事件时该怎么做,这是通常的查询)。在


Tags: django语言信息应用程序间隔高度postgresql时间
1条回答
网友
1楼 · 发布于 2024-05-16 10:41:19

我将保留两个模型-一个用于描述重复出现的规则,另一个用于实际发生的情况(每个规则可以有多次出现,但不是无限多个,因为您声明它们具有“合理的终止”)。在

class Rule(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()
    frequency = models.CharField(max_length=1, choices=FREQUENCIES)
    interval = models.PositiveIntegerField()
    duration = models.PositiveIntegerField() # duration may be in seconds or minutes?
    # and so on, add all the fields you need to define the rule

class Occurrence(models.Model):
    rule = models.ForeignKey(Rule)
    start = models.DateTimeField(db_index=True)
    end = models.DateTimeField(db_index=True)

给定一个规则的实例,您可以使用python dateutil中的rrule来生成它的所有实例并将它们保存到数据库中。当然,会有很多这样的记录,但是这些都是小的,简单的记录,数据库在有效地处理这些记录时不会有任何问题。因此,现在查找当前活动的所有事件的问题很简单:

^{pr2}$

如果需要规则实例而不是实例:

Rule.objects.filter(occurrence__start__lte=d, occurrence__end__gte=d)

相关问题 更多 >