所以这是我在这里的第一个问题,但是我有一个小变化:

所以我有两个人的日程表都在数据库中。时间表仅记录两个用户的开始时间,结束时间以及各种事件/约会的描述。

PersonA希望与PersonB进行约会。我想要一个MySQL查询,该查询将返回PersonB和PersonA可以交换的所有时间。

最初,查询的参数是丢弃与PersonA重叠的PersonB的任何约会,并且PersonB的约会必须与PersonA要交换的约会的长度完全相同。我对时间算术/几何学提出了一些很好的建议,可以帮助我获得所需的结果。

现在,我想更改1-to-1参数,以便约会的长度不必相等。因此,如果PersonA想交换星期一的早上约会(上午10:00-上午11:30),则查询将:


不包括在PersonA任命中的任何PersonB任命
包括不在PersonA约会中的任何PersonB约会
包括PersonB约会中PersonA是免费的部分,但仅显示空闲部分。


因此,如果PersonA要交换上述约会(再次是星期一10:00 AM-11:30 AM),并且PersonA在星期二1:00 PM到3:00 PM进行约会,而PersonB在星期二12点进行约会: 00 PM到4:00 PM,查询将返回:

Possible_Swaps
==============
userID  | Start             | End             | Description
PersonB | Tuesday, 12:00 PM | Tuesday 1:00 PM | Cooking
PersonB | Tuesday,  4:00 PM | Tuesday 5:00 PM | Cooking


除了任何其他可能性。从数据库中期望这太多了吗?如果是这样,关于如何至少获得那些重叠但又有时间悬而未决的变化的任何建议,以便PHP脚本可以应对这些变化?



根据searlea的要求,这里有更多上下文:

我一直在说约会,但我认为我的意思是“工作”和“轮班”。 PersonA和PersonB在同一办公室工作。在vcalendar中,轮班通常被称为“事件”,但有时也称为“约会”,我也选择后者,因为听起来好像两个人要公平。

因此,PersonA星期一的洗碗时间为10:00 AM-11:30 AM。 PersonB在星期二的12:00 PM到5:00 PM烹饪。 PersonA真的很想在星期一他们的兄弟离开城镇之前去见他的兄弟。他宁愿在整个星期一早上下班,但他愿意下班一个小时。

因此,在我的旧模型(此处在my very first question中汇总)中,我正在寻找没有重叠且时间上相等的任何变化。但这有两个问题:


如果我需要某人来弥补我在星期二的2个小时的班次,并且我在星期四工作4个小时,而乔在星期四工作8个小时,我可以交换他的两个小时,他可以早一点离开,我可以留下一点时间后来。
如果我有两个小时的班次,但是我很乐意将其中的一个小时换来,以便准时到达机场,我想知道一周之内是否比我早一小时到达,所以我可以承担他的工作的一部分。


长话短说(太晚了),我想要的是PersonA向PersonB转移的relative complement(基本上在PersonB工作的任何时候,PersonA没有工作的任何时候,无论转移是否在其他时间重叠)。

理想情况下,我将获得一组结果,其中包括PersonB正在工作而PersonA未工作的位(上述两个1小时班次),以及整个班次(带有特殊标签指示不能作为整体),以便PersonA看到自己正在轮班工作,而不会感到困惑,并认为PersonB恰好正在轮班工作两个1小时。

这一切听起来有点复杂。基本上,我希望PersonB的偏移为蓝色,PersonA的偏移为黄色,并且我希望数据库返回所有非绿色的部分。

最佳答案

SELECT *
  FROM schedule AS s1
WHERE
  s1.user = 'Ondra'
AND
NOT EXISTS (
  SELECT * FROM schedule AS s2
  WHERE
    s2.user = 'Zizka'
    AND (
      s2.start BETWEEN s1.start AND s1.end
      OR
      s2.end BETWEEN s1.start AND s1.end
      OR
      s1.start > s2.start AND s1.end < s2.end
    )
)


这选择了可以适合Zizka日记中空白的Ondra事件。

编辑:最初是一个相交,但是如果您想要相对互补,就足够了。

10-06 00:10