如何查询 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[=,两个 datetime
s 不会 重叠33=]2 或 e2≤s1 si 和 ei 开始和结束片段 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)]
我有一个带有 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[=,两个 datetime
s 不会 重叠33=]2 或 e2≤s1 si 和 ei 开始和结束片段 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)]