https://www.postgresql.org/docs/current/rangetypes.html
Range 类型,可以描述一个数据区间,有明确的子类型,而且子类型应该能被排序。
PostgresSQL 有如下 range 类型:
CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
-- Containment
SELECT int4range(10, 20) @> 3; -- FALSE
-- Overlaps
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0); -- 返回TRUE, 表示两个区间有交集
-- Extract the upper bound
SELECT upper(int8range(15, 25)); -- 返回 25, 表示区间的上界
-- Compute the intersection
SELECT int4range(10, 20) * int4range(15, 25); -- 返回[15, 20), 表示交集区间
-- Is the range empty?
SELECT isempty(numrange(1, 5)); -- 返回 FALSE, 表示区间为空
每个非空区间都有两个界限,即下界和上界。这些值之间的所有点都包含在该范围内。包含边界意味着边界点本身也包括在范围内,而排除边界意味着边界点不包括在范围内。
函数 lower_inc 和 upper_inc 分别测试范围值的下界和上界,是否为闭区间。若为闭区间则返回 TRUE。
select lower_inc(numrange(10, 20)); -- 返回 TRUE 表示左闭区间
select upper_inc(numrange(10, 20)); -- 返回 FALSE 表示右开区间
select lower_inc(tsrange('[2010-01-01 14:30, 2010-01-01 15:30]')); -- 返回 TRUE 表示左闭区间
select upper_inc(tsrange('[2010-01-01 14:30, 2010-01-01 15:30]')); -- 返回 TRUE 表示右闭区间
select lower_inc(tsrange('[2010-01-01 14:30, 2010-01-01 15:30)')); -- 返回 TRUE 表示左闭区间
select upper_inc(tsrange('[2010-01-01 14:30, 2010-01-01 15:30)')); -- 返回 FLASE 表示右开区间
(,3]
则表示 <=3 的都在区间内。(,3]
则表示 <=3 的都在区间内。[,]
会被转换为 (,)
最重要的,还是可以用 函数 lower_inc 和 upper_inc 测试。