【发布时间】:2013-10-21 21:06:19
【问题描述】:
我正在创建一个在 PostgreSQL 9.2.4 中存储任意日期/时间范围的数据库。我想在这个数据库上设置一个约束,强制日期/时间范围不重叠,也不相邻(因为两个相邻的范围可以表示为一个连续的范围)。
为此,我使用带有 GiST 索引的EXCLUDE 约束。这是我目前的约束:
ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
box(
point (
extract(EPOCH FROM "from") - 1,
extract(EPOCH FROM "from") - 1
),
point (
extract(EPOCH FROM "to"),
extract(EPOCH FROM "to")
)
) WITH &&
);
from 和 to 列都是 TIMESTAMP WITHOUT TIME ZONE,并且是以 UTC 格式存储的日期/时间(我在将数据插入应用程序的这些列之前转换为 UTC,并且我将数据库的时区设置为“ UTC”在 postgresql.conf 中)。
不过,我想我可能遇到的问题是,这个约束正在做出(不正确的)假设,即没有小于一秒的时间增量。
值得注意的是,对于我存储的特定数据,我只需要第二个分辨率。但是,我觉得我可能仍然需要处理这个问题,因为 SQL 类型 timestamp 和 timestamptz 的分辨率都高于一秒。
我的问题是:简单地假设第二个解决方案有什么问题,因为这就是我的应用程序需要(或想要的),或者,如果有,我如何改变这个约束来处理分数以稳健的方式排名第二?
【问题讨论】:
标签: sql postgresql datetime range-types exclusion-constraint