如何查询Postgres DateRange字段中的重叠日期



我有一个PostgreSQLDateRange字段的模型:

class MyModel(models.Model):
date_range = DateRangeField()

如果我想查询这个,看看是否有另一个日期重叠,这很容易:

MyModel.objects.filter(date_range__overlap=other_date)

但是,如果我已经构建了一个DateRange对象列表,我如何搜索列表,询问列表的相同事情(而不是查询集)。例如:"此日期范围是否与此列表中的任何日期范围重叠?":

mylist = [DateRange([2021-10-04, 2021-10-05]), DateRange([2022-10-04, 2022-10-05])]
for dr in mylist:
dr.overlap(query_date) # fails

注意:DateRange对象没有属性overlap/docs。

我们知道,如果e1≤s2e2≤s1siei片段i的开头和结尾分别为sei,则两个datetimes重叠。

这就意味着在e1>s2e2>s1情况下,两个确实是重叠的。因此,我们可以构造一个重叠检查:
def is_overlap(dr1, dr2):
return dr1.upper > dr2.lower and dr2.upper > dr1.lower

接下来我们可以发现如果任何项目重叠:

any(is_overlap(query_date, dr) for dr in mylist)

或者我们可以构造一个包含所有与query_date重叠的DateRange的列表:

[dr for dr in mylist if is_overlap(query_date, dr)]

最新更新