<p><em>应该能够做的是聚合要查询的数据,并合并任何重叠(或相邻)范围。在</p>
<p>Postgres没有任何方法做到这一点:它有用于并集和合并相邻范围的运算符,但没有任何运算符可以聚合重叠/相邻范围的集合。在</p>
<p>但是,您可以编写一个查询来组合它们,尽管如何使用ORM来实现这一点还不明显。在</p>
<p>这里有一个解决方案(作为<a href="http://schinckel.net/2014/11/18/aggregating-ranges-in-postgres/#comment-2834554302" rel="nofollow noreferrer">http://schinckel.net/2014/11/18/aggregating-ranges-in-postgres/#comment-2834554302</a>上的注释留下,并进行了调整以组合相邻的范围,这似乎是您想要的):</p>
<pre><code>SELECT int4range(MIN(LOWER(value)), MAX(UPPER(value))) AS value
FROM (SELECT value,
MAX(new_start) OVER (ORDER BY value) AS left_edge
FROM (SELECT value,
CASE WHEN LOWER(value) <= MAX(le) OVER (ORDER BY value)
THEN NULL
ELSE LOWER(value) END AS new_start
FROM (SELECT value,
lag(UPPER(value)) OVER (ORDER BY value) AS le
FROM range_test
) s1
) s2
) s3
GROUP BY left_edge;
</code></pre>
<p>在ORM中可以查询的一种方法是将它放在Postgres视图中,并有一个引用它的模型。在</p>
<p>但是,值得注意的是,它查询整个源表,因此您可能希望应用筛选;可能是通过<code>de_property</code>。在</p>
<p>比如:</p>
^{pr2}$
<p>另外,您可能需要考虑使用Postgres的date range对象,因为这样可以防止<code>start > finish</code>(自动),也可以使用排除约束来防止给定属性的句点重叠。在</p>
<p>最后,另一种解决方案可能是生成一个派生表,该表存储<em>un</em>的可用性,基于获取可用周期并反转它们。这使得编写查询更简单,因为您可以编写直接重叠,但求反(也就是说,如果没有重叠的不可用时段,属性对于给定的时段是可用的)。我在一个生产系统中对员工的可用性/不可用性进行检查,在这个系统中需要进行许多检查。请注意,这是一个非规范化的解决方案,它依赖于触发器函数(或其他更新)来确保它保持同步。在</p>