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:
范围 1 => 0:00 - 08:00
范围 2 => 07:59 - 12:00
这显示重叠是正确的。
场景 2:
范围 1 => 0:00 - 08:00
范围 2 => 08:00 - 12:00
这没有显示重叠。这是不正确的,因为 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 索引支持条件。
我在我的应用程序中使用 Rails 5 和 postgresql。
查询如下
.where('(start_time, end_time) OVERLAPS (time without time zone ?, time without time zone ?)',
start_time, end_time)
场景 1:
范围 1 => 0:00 - 08:00
范围 2 => 07:59 - 12:00
这显示重叠是正确的。
场景 2:
范围 1 => 0:00 - 08:00
范围 2 => 08:00 - 12:00
这没有显示重叠。这是不正确的,因为 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 索引支持条件。