PostgreSQL OVERLAPS overator 不包括结束时间 - Rails

PostgreSQL OVERLAPS overator not inclusive of end time - Rails

我在我的应用程序中使用 Rails 5 和 postgresql。

查询如下

.where('(start_time, end_time) OVERLAPS (time without time zone ?, time without time zone ?)',
               start_time, end_time)

场景 1:

这显示重叠是正确的。

场景 2:

这没有显示重叠。这是不正确的,因为 08:00 落在两个时间范围内。

我假设问题是 OVERLAPS 考虑 < end_time 而不是 <= end_time.

知道如何解决这个问题吗?

The documentation 说得很清楚:

Each time period is considered to represent the half-open interval <em><strong>start</strong></em> <= <em><strong>time</strong></em> < <em><strong>end</strong></em>, unless <em><strong>start</strong></em> and <em><strong>end</strong></em> are equal in which case it represents that single time instant. This means for instance that two time periods with only an endpoint in common do not overlap.

你可以用范围类型和重叠运算符得到你想要的东西 &&:

WHERE tsrange(start_time, end_time, '[]') && tsrange(?, ?, '[]')

此处 tsrange 的第三个参数指定两端都包括在内。

使用范围还有一个额外的优势,即您可以使用 GiST 索引支持条件。