gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:25:58 25 4
gpt4 key购买 nike

我正在开发处理事件的应用程序。 (语言:Python 2.7,RDBMS:PostgreSQL,CSM:Django 1.9.6)。我需要存储有关日历事件的信息。它们具有高度可定制的时间间隔(例如:从 3 月 5 日凌晨 5:00 开始,每个星期四重复 5 次,持续时间为 45 分钟;或者每月每个奇数日的下午 6:00 重复,持续时间为 1 天零 2 小时(从 1 日开始)下午 6:00 至第 2 天晚上 8:00,然后从第 3 天下午 6:00 至第 4 天晚上 8:00))。

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

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

最佳答案

我会保留两种模型 - 一种用于描述重复出现的规则,另一种用于实际出现(每条规则可以多次出现,但不是无限次,因为您声明它们具有“明智的终止”)。

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 生成它的所有出现并将它们保存到数据库中。当然,会有很多,但这些都是小而简单的记录,数据库可以有效地处理这些记录。所以现在找到所有当前事件的事件的问题是微不足道的:

Occurrence.objects.filter(start__lte=d, end__gte=d)

如果您想要规则实例而不是出现次数:

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

关于python - 在数据库中存储复杂的时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com