【发布时间】:2018-02-08 20:37:52
【问题描述】:
Determine Whether Two Date Ranges Overlap 非常简单。我的情况有点困难,但必须有一个简单的解决方案。
我有以下表格:
CREATE TABLE catalog_version
(
id character varying(36) NOT NULL,
name character varying(255),
valid_from timestamp without time zone,
valid_to timestamp without time zone,
)
CREATE TABLE catalog_article
(
id character varying(36) NOT NULL,
code character varying(100),
catalog_version_id character varying(36),
valid_from timestamp without time zone,
valid_to timestamp without time zone,
)
以下限制:
- 目录 1..1 - 0..n 目录版本。
- 目录版本 1..1 - 0..n 目录文章。
- valid_from 和 valid_to 对于两个版本和文章都是可选的。
- 如果文章没有date_from,则版本开始时有效。
- 如果文章没有 date_to,则在版本过期之前有效。
- 不能有两篇具有相同代码的文章同时有效。
- 该框架使用查询构建器,这意味着我不能使用任何数据库特定功能。
有没有一种方法可以简单地检测在给定时间是否已经存在有效文章,如果用户尝试定义新的目录文章?
例子:
----------------------------------------Version A---------------------------------------I
I--Article ABC--I
I--Article ABC--I
Valid cases:
I-Article ABC-I
I-Article ABC-----------------
--Article ABC--I
Invalid cases:
-----------------------------------------Article ABC-------I
I----------Article ABC-----------------------------------
有没有人知道是否有办法简化这项任务?我手头唯一的解决方案是为每个可能的情况创建 AND 条件。
【问题讨论】:
-
这是什么关系型数据库?如果是 Postgres,您可以使用 range functions 来检测范围重叠。然后它只是
WHERE range1 && range2而不是所有的 AND 业务。