如何比较pgsql中的“从”和“到”时间字段?

时间:2019-01-21 07:30:58

标签: postgresql

如何比较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)

);

1 个答案:

答案 0 :(得分:0)

这可以通过exclusion constraingrange 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)).