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

How to query overlapping dates on Postgres DateRange field

我有一个带有 PostgreSQL DateRange 字段的模型:

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

如果我想查询这个以查看另一个日期是否重叠,这很简单:

MyModel.objects.filter(date_range__overlap=other_date)

但是如果我构建了一个 DateRange 对象的列表,我如何搜索列表并询问列表的相同内容(而不是查询集)。 IE。 “此 DateRange 是否与此列表中的任何 DateRanges 重叠?”:

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≤s[=,两个 datetimes 不会 重叠33=]2e2≤s1 siei 开始和结束片段 i 分别。

这意味着两个 do 重叠 e1>s2 e2>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)]