我正在创建一个在 PostgreSQL 9.2.4 中存储任意日期/时间范围的数据库。我想在这个数据库上设置一个约束,强制日期/时间范围不重叠,也不相邻(因为两个相邻的范围可以表示为一个连续的范围)。
为此,我使用了EXCLUDE
带有 GiST 索引的约束。这是我目前的约束:
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,并且我在 postgresql.conf 中将数据库的时区设置为“UTC”)。
不过,我想我可能遇到的问题是,这个约束正在做出(不正确的)假设,即没有小于一秒的时间增量。
值得注意的是,对于我存储的特定数据,我只需要第二个分辨率。但是,我觉得我可能仍然需要处理这个问题,因为 SQL 类型timestamp
和timestamptz
分辨率都高于一秒。
我的问题是:简单地假设第二个解决方案有什么问题,因为这就是我的应用程序需要(或想要的),或者,如果有,我如何改变这个约束来处理几分之一秒健壮的方式?