【问题标题】:How to query overlapping dates on Postgres DateRange field如何在 Postgres DateRange 字段上查询重叠日期
【发布时间】:2021-11-25 05:19:53
【问题描述】:

我有一个带有 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 对象没有属性 overlapdocs

【问题讨论】:

  • 查询集是否应该包含与DateRanges 中的任何 个或DateRanges 中的所有 个重叠的MyModel 对象。
  • @WillemVanOnsem 任何日期范围

标签: django postgresql psycopg2


【解决方案1】:

我们知道如果 e1≤s2 或 e2≤s1sie i分别是片段i的开始和结束。

因此这意味着两个 doe1>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重叠的所有DateRanges的列表:

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

【讨论】:

  • 谢谢,但我想查询列表,而不是现有对象,除非我弄错了? IE。 “此 DateRange 是否与此列表中的任何 DateRanges 重叠?”
  • 它将检索至少与DateRanges 之一重叠的所有MyModel 对象。
  • 对不起,我没有说清楚。我以 MyModel 为例说明如何在查询集上使用 overlap。我想检查该项目是否与列表中的任何内容重叠,而不是现有记录。
  • any(map(query_date.overlap, mylist)) 导致'DateRange' object has no attribute 'overlap'
  • @alias51:更新后的答案应该在query_datemylist 中的所有drs 之间进行重叠检查。如果检测到一个(或多个)重叠,则any(...) 表达式将返回True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多