postgresql 范围类型-阿里云开发者社区

开发者社区> rudygao> 正文

postgresql 范围类型

简介:
+关注继续查看



--pg支持范围类型

• int4range — Range of integer

• int8range — Range of bigint

• numrange — Range of numeric

• tsrange — Range of timestamp without time zone

• tstzrange — Range of timestamp with time zone

• daterange — Range of date


--范围时间戳

CREATE TABLE reservation (room int, during tsrange);

--插入范围内时间

INSERT INTO reservation VALUES

(1108, '[2010-01-01 14:30, 2010-01-01 15:30)');

 --正无空大,负无穷小 -infinity 代表无穷小

 INSERT INTO reservation VALUES

(1109, '[2010-01-01 14:30,"infinity" )'),(1110, '["-infinity",2010-01-01 14:30)');

postgres=# select * from reservation ;

 room |                    during                     

------+-----------------------------------------------

 1108 | ["2010-01-01 14:30:00","2010-01-01 15:30:00")

 1109 | ["2010-01-01 14:30:00",infinity)

 1110 | [-infinity,"2010-01-01 14:30:00")

 

 -- Containment 范围内是否包含某一个值

SELECT int4range(10, 20) @> 3;

-- Overlaps 两个范围是否有重叠

SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);

-- Extract the upper bound 求范围的上限

SELECT upper(int8range(15, 25));

-- Compute the intersection 求两个范围的交集

SELECT int4range(10, 20) * int4range(15, 25);

-- Is the range empty? 判断范围是否为空

SELECT isempty(numrange(1, 5));


--每个范围类型都有一个与对应的构造函数,注意第三个参数说明其是全包围还是半包围

postgres=# SELECT int8range(1, 14, '(]');

 int8range 

-----------

 [2,15)

postgres=# SELECT numrange(NULL, 2.2);

 numrange 

----------

 (,2.2)

 

--用户也可以自定义范围类型,注意如果想要更好的使用GiST or SP-GiST索引,则需要定义一个差异化函数

--差异化函数要返回一个float8的值,并且其结果不能受字符集和排序规则的影响

--The subtype difference function takes two input values of the subtype, and returns their difference (i.e., X minus Y) represented as a float8 value

--the subtype_diff function should agree with the sort ordering implied by the selected operator class and collation


--创建差异化函数

CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS

'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;

--创建自定义的范围类型

CREATE TYPE timerange AS RANGE (

subtype = time,

subtype_diff = time_subtype_diff

);


postgres=# SELECT '[11:10, 23:00]'::timerange;

      timerange      

---------------------

 [11:10:00,23:00:00]

 

 

 --可以对范围类型的表列创建 GiST 和 SP-GiST 索引。

 --虽然对范围类型的表列可以创建 B-tree 和哈希索引,但不建议使用

 --There is a B-tree sort ordering defined for range values, with corresponding < and > operators, but the ordering is rather arbitrary and not usually useful in the real world

CREATE INDEX reservation_idx ON reservation USING gist (during);


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9893 0
SQL Server 2008 各种DateTime的取值范围
SQL Server 2008除了DateTime和SmallDateTime之外,又新增了四种时间类型,分别为:date,time,datetime2和datetimeoffset。 各时间类型范围、精度一览表: 数据类型 时间范围 精度 datetime 1753-01-01到9999-12-31 00:00:00 到 23:59:59.
514 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13624 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11842 0
PostgreSQL 百亿级数据范围查询, 分组排序窗口取值 极致优化 case
本文将对一个任意范围按ID分组查出每个ID对应的最新记录的CASE做一个极致的优化体验。优化后性能维持在可控范围内,任意数据量,毫秒级返回,性能平稳可控。比优化前性能提升1万倍。 CASE如下: 有一张数据表,结构: CREATE TABLE target_position
12777 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7270 0
K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》
0、存储过程开头变量定义 @FBeginDate varchar(10), --单据起始日期 @FEndDate varchar(10), --单据截止日期。
949 0
+关注
32
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载