如何比较Postgres中的“从”和“到”时间字段?
假设我的表中的一条记录在12:00:00
字段中有from
,在“ to”字段中有18:00:00
。
现在,如果我在12:00:00
字段中创建一个值为from
并在13:00:00
字段中值为to
的新记录,则该记录应已存在,因为12到13出现在12到18之间。这意味着用户无法使用from和to时间值创建重复记录。
create SEQUENCE transport_id_seq;
CREATE TABLE transport (
"id" int4 NOT NULL DEFAULT nextval('transport_id_seq'::regclass),
"from_time" time(6),
"to_time" time(6)
);
答案 0 :(得分:0)
这可以通过exclusion constraing和range types来完成。
time
数据类型没有预定义的范围类型,但是可以轻松创建它:
create type timerange as range (
subtype = time
);
使用该范围类型,您可以使用以下方法定义排除约束,以防止时间重叠:
alter table transport add constraint unique_time_range
exclude using gist (timerange(from_time, to_time) with &&);
如果表中存在以下行:
insert into transport (from_time, to_time)
values (time '12:00', time '18:00');
然后此插入将失败:
insert into transport (from_time, to_time)
values (time '12:00', time '13:00');
,显示错误:
ERROR: conflicting key value violates exclusion constraint "unique_time_range" Detail: Key (timerange(from_time, to_time))=([12:00:00,13:00:00)) conflicts with existing key (timerange(from_time, to_time))=([12:00:00,18:00:00)).