首页 > 解决方案 > 如何比较 pgsql 中的“从”和“到”时间字段?

问题描述

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

假设我的表中有一条记录,该记录具有12:00:00infrom字段和18:00:00“to”字段。

12:00:00现在,如果我在字段中创建一个新记录并为字段 中from的值赋值,它应该显示已经存在,因为 12 到 13 存在于 12 到 18 中。意味着防止用户使用从和到时间值创建重复记录。13:00:00to

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)

);

标签: postgresql

解决方案


这可以通过使用范围类型的排除约束来完成。

数据类型没有预定义的范围类型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)).

推荐阅读