Postgres支持范围类型(permalink),如int4range
或tstzrange
。tstzrange
的文档为"Range oftimestamp with time zone
"。
时间戳的默认精度是使用6位数字表示秒分数(微秒分辨率),但是我的应用程序通过timestamp (3) with time zone
使用3位数字表示时间戳(毫秒)。为了保持一致性,我还想对我的时间段使用毫秒级的分辨率。
默认的tstzrange
分辨率是多少?如何配置它?
我试图用tstzrange(3)
定义我的表,但这个形式是不支持的。应用于文档中的示例,它看起来像:
CREATE TABLE reservation (
during tstzrange(3),
EXCLUDE USING GIST (during WITH &&)
);
从Postgres 13开始,tstzrange
的时间分辨率使用6位数表示秒分(微秒分辨率)。此分辨率不能更改。
要创建具有自定义分辨率的时间戳之间的范围,必须定义一个新的范围类型。下面是创建一个毫秒级分辨率的时间戳范围的查询:
CREATE TYPE tstzrange3 AS RANGE (
subtype = timestamp (3) with time zone
);
这既定义了tstzrange3
类型,也定义了同名的构造函数。
你可以像使用其他范围一样使用这个类型:
CREATE TABLE reservation (
during tstzrange3,
EXCLUDE USING GIST (during WITH &&)
);
INSERT INTO reservation(during) VALUES(tstzrange3(NOW(), NULL));