如何匹配 table 中的所有行,其中间隔与“start_time”和“end_time”列相交?

How to match all rows in a table in which an interval intersects the `start_time` and `end_time` columns?

我有 table,start_timeend_time 列都设置为时区类型的时间戳。此 table 包含连续间隔,即一行的 end_time 是下一行的 start_time

现在,我需要 select 所有与特定时间间隔(两个时间戳)相交的行。

例如,table 可能如下所示:

 id |         start_time         |          end_time
----+----------------------------+----------------------------
 1  | 2022-01-23 15:00:00.000+00 | 2022-01-23 16:00:00.000+00
 2  | 2022-01-23 16:00:00.000+00 | 2022-01-23 17:00:00.000+00
 3  | 2022-01-23 17:00:00.000+00 | 2022-01-23 18:00:00.000+00
 4  | 2022-01-23 18:00:00.000+00 | 2022-01-23 19:00:00.000+00

我想要 select 与从 2022-01-23 16:23:00.000+00 开始到 2022-01-23 18:44:00.000+00 结束的区间相交的所有行,即行 ID 2-4。

我可以使用三个 SQL 命令做到这一点:

但是,任何搜索时间都不能包含在 table 的任何间隔中(就像 2022-01-23 15:00:00.000+00 之前或 2022-01-23 19:00:00.000+00 之后的任何时间戳)。

有没有更好的方法?

你必须使用这个:

SELECT * FROM your_table 
WHERE start_time < '2022-01-23 18:44:00.000+00' AND end_time > '2022-01-23 16:23:00.000+00'

所以start_time必须小于搜索区间的end并且end_time必须大于start 的区间。

DB Fiddle

输出:

id start_time end_time
2 2022-01-23T16:00:00.000Z 2022-01-23T17:00:00.000Z
3 2022-01-23T17:00:00.000Z 2022-01-23T18:00:00.000Z
4 2022-01-23T18:00:00.000Z 2022-01-23T19:00:00.000Z

Postgres 知道 range data types (which you could use in your table) and also a range overlap operator &&

SELECT *
       FROM elbat
       WHERE tstzrange(start_time, end_time)
             && '[2022-01-23 16:23:00.000+00, 2022-01-23 18:44:00.000+00]'::tstzrange;