postgresql - 如何比较 pgsql 中的“从”和“到”时间字段?
问题描述
如何比较 Postgres 中的“从”和“到”时间字段?
假设我的表中有一条记录,该记录具有12:00:00
infrom
字段和18:00:00
“to”字段。
12:00:00
现在,如果我在字段中创建一个新记录并为字段 中from
的值赋值,它应该显示已经存在,因为 12 到 13 存在于 12 到 18 中。意味着防止用户使用从和到时间值创建重复记录。13:00:00
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)
);
解决方案
数据类型没有预定义的范围类型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)).
推荐阅读
- c# - 开箱即用的 ASP.NET Core 3.1 应用程序可在 VS 2019 中运行,但不能从 iis 中运行。获取 HTTP 错误 500.19 0x8007000d
- android - 关于我的android项目上的静态接口方法的错误
- swift - 为什么在 Sprite-kit 中创建 SKLabelNode 会导致“线程 1:致命错误:在隐式展开可选值时意外发现 nil”
- java - 如何在主线程中执行一个动作?
- python-3.x - 安装后相关的初始化remo,用于构建image-annotation-web-app
- php - 调用 Laravel Auth 辅助方法的最佳方法
- javascript - 更改页面 HTML 按钮单击 React
- python - 熊猫将列添加到时间序列的数据框聚合中
- android - Android 中的 AdvertisingSet 类的以下实现有什么问题?
- dart - 动态列表到字符串列表