我正在研究在 MySQL 中开发一些东西。想象一下,我在 MySQL 数据库中有一些“项目”和一些“时间框架”。许多“时间框架”可能属于每个“项目”。包含“时间范围”的表格有一个将其链接到每个项目的 ID。任何类型的“时间范围”都不能重叠——这很容易查询:
SELECT * FROM `timeframes` WHERE end > proposedstart AND start < proposedend
但是-理想情况下,我希望返回以下内容-新的时间范围可能不在不是它自己的“项目”中(由属于该项目的最早“时间范围”日期和属于该项目的最新“时间范围”日期定义)项目) - 但可能出现在其自己的“项目”中的两个时间范围之间。有什么方法可以从“时间框架”表中以类似的格式查询吗?
这是描述的输出
mysql> DESCRIBE projects;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| projectID | int(11) | NO | PRI | NULL | auto_increment |
| projectName | varchar(225) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> DESCRIBE timeframes;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| timeframeID | int(11) | NO | PRI | NULL | auto_increment |
| projectID | int(11) | NO | | NULL | |
| timeframeName | varchar(225) | NO | | NULL | |
| timeframeStart | date | NO | | NULL | |
| timeframeEnd | date | NO | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
假设我在项目表中有三个项目,分别称为项目 1、项目 2 和项目 3。假设我有两个与项目 1 相关联的时间范围。第一个时间范围称为时间范围 1,从 2014 年 1 月 7 日开始,到 2014 年 3 月结束-28。第二个,在 2014 年 4 月 28 日被称为时间框架 2,并在 2014 年 7 月 11 日结束。我还有两个与项目 3 相关的时间范围——第一个开始于 2015 年 9 月 7 日,结束于 2015 年 12 月 11 日。第二次从 2016 年 1 月 6 日开始,到 2016 年 3 月 18 日结束。现在 - 假设我想添加一个与项目 2 相关的时间范围。它可能不是 2014-01-07 和 2014-07-11 之间的任何日期,也可能不是 2015-09-07 和 2016-03-18 之间的任何日期。因此,即使项目 2 的时间范围可能介于项目 1 或 3 的两个时间范围之间,我也不希望这种情况发生。例如,项目 2 中任何时间范围的可接受值是 2013-12-12 到 2014-01-06、2014-07-12 到 2015-09-06 或更窄的范围。我不希望诸如 2014-04-01 到 2014-04-27 之类的时间范围对项目 2 有效。但是,这些日期可能仅对项目 1 有效。