如何匹配 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_time
和 end_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 命令做到这一点:
- 获取第一个时间戳所在行的ID;
- 获取第二个时间戳所在行的ID;
- select 基于先前 ID 的所有行。
但是,任何搜索时间都不能包含在 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 的区间。
输出:
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;
我有 table,start_time
和 end_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 命令做到这一点:
- 获取第一个时间戳所在行的ID;
- 获取第二个时间戳所在行的ID;
- select 基于先前 ID 的所有行。
但是,任何搜索时间都不能包含在 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 的区间。
输出:
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;