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);

时间: 2024-11-09 14:42:36

postgresql 范围类型的相关文章

简单介绍Ruby on Rails对PostgreSQL数组类型的支持_ruby专题

 我非常高兴在宣布Rails 4.0 现在支持 PostgreSQL 数组类型. 你可以方便的在migration通过 :array => true里创建数组类型的字段. 创建数组类型的字段的时候还可以添加其它的选项(length,default,等等)   create_table :table_with_arrays do |t| t.integer :int_array, :array => true # integer[] t.integer :int_array, :array =&

postgresql 时间类型和相关函数

今天来好好学习一下postgresql涉及时间的字段类型和一些时间的转换函数  一.时间类型: 名字                                  存储空间    描述                     最低值          最高值            分辨率 timestamp [ (p) ] [without time zone] 8字节      包括日期和时间           4713 BC          5874897 AD        1 毫

postgresql 数组类型

 --pg支持数组,且支持分片访问,比如[1:2],任意只有一个数字(没有冒号)的维数是从 1 开始到声明的数字为止的  --如果任意维数被写为一个片段,也就是,包含一个冒号,那么所有维数都被当做是片段 If any dimension is written as a slice, i.e., contains a colon, then all dimensions are treated as slices.  Any dimension that has only a single num

《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列二:数字类型

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用.随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多.数据库之间数据迁移的时候,首先遇到的,并且也是最重要的,就是数据类型之间的转换.下面根据自己的理解和测试,写了一些数据类型之间的差异以及迁移时的注意事项的文章,不足之处,尚请多多指教. 数字类型 Oracle内建的数字类型有四种,分别是number,float,binary_float,bin

介绍PostgreSQL中的范围类型特性_数据库其它

 PostgreSQL 9.2 的一项新特性就是范围类型 range types,通过这个名字你可以轻松猜出该类型的用途,它可让你为某列数据定义数值范围. 这个简单的特性可以让我们不需要定义两个字段来描述数值的开始值和结束值,一个最直观的例子就是:   postgres# CREATE TABLE salary_grid (id int, position_name text, start_salary int, end_salary int); CREATE TABLE postgres# I

PostgreSQL MySQL 数据类型映射

标签 PostgreSQL , MySQL , 类型映射 背景 通常一家企业会有比较多的数据库品种,最为常见的如MySQL, PostgreSQL. 那么在不同的产品之间,如果有数据的相互同步,就涉及到类型的映射了. 对于PostgreSQL来说,可以使用PostgreSQL的mysql_fdw外部插件来实现同步,产品设计会简化很多. 而对于MySQL来说,可能就比较复杂,需要自己写程序来实现,会涉及到类型的转换. PostgreSQL类型 转换为 MySQL类型 https://dev.mys

PostgreSQL Oracle 兼容性之 - BIT_TO_NUM , BITAND , 比特运算 , 比特与整型互相转换

背景 比特类型转换为整型,整型转换为比特类型,以及整型的比特运算. 在数据分析时被经常使用,例如对多个用0和1表示的标签字段叠加,使用一个整型表示. 又或者将数字表述的标签信息转换为比特位,以获取分散的标签信息. 在Oracle中可以使用bit_to_num将多个0,1转换为number,使用bitand对两个number进行比特与运算得到另一个number. bit_to_num(exp1, exp2, ...., expn) BIN_TO_NUM converts a bit vector

Greenplum 类型一致性使用规范 - 索引条件、JOIN的类型一致性限制

标签 PostgreSQL , Greenplum , 类型一致 , 索引 , inner转换 , join 背景 在查询时,有很多用户会犯浑,发现建立了索引,但是查询偏偏不走索引. 怎么不走索引啊? 这里做容易混淆的是类型的差异,例如字段类型为字符串,但是输入的是INT类型,这样就可能不走索引.(除非创建了自动的CAST,自动进行类型转换) 查询的输入类型与索引的类型一致是非常有必要的. 例子 1.建表(使用变长.定长字符串类型),写入测试数据 create table tbl3(id int

PostgreSQL 全文检索加速 快到没有朋友 - RUM索引接口(潘多拉魔盒)

PostgreSQL 全文检索加速 快到没有朋友 - RUM索引接口(潘多拉魔盒) 作者 digoal 日期 2016-10-19 标签 PostgreSQL , RUM , GIN , full text search , 全文检索 , bitmap scan 背景 全文检索,模糊查询在现实的应用中用得非常多,特别是搜索引擎. 通常我们会想到使用搜索引擎来解决,但是需要考虑数据同步到搜索引擎,以及同步延迟,更新,一致性的问题. 并且使用搜索引擎我们还得多维护一个组件. 那么有没有更好的办法呢?