gpt4 book ai didi

mysql - MySQL中的日期字段,查找所有不重叠的行并仅返回差异

转载 作者:行者123 更新时间:2023-11-29 15:09:04 27 4
gpt4 key购买 nike

所以这是我在这里的第一个问题之一,但我有一点不同:

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

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

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

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

  • 排除在 PersonA 的一个约会期间的任何 PersonB 约会
  • 包括在 PersonA 的约会之外的任何 PersonB 的约会
  • 包括 PersonA 空闲时的 PersonB 约会部分,但只显示空闲部分。

  • 因此,如果 PersonA 想要交换上述约会(同样是周一上午 10:00 - 上午 11:30),并且 PersonA 有一个周二下午 1:00 到下午 3:00 的约会,而 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 到 11:30 有一个洗碗类。 PersonB 在星期二中午 12:00 到下午 5:00 做饭。 PersonA 真的很想在周一离开城镇之前见到他的兄弟。他宁愿整个星期一早上都休息,但他宁愿休息一个小时。

    因此,在我的旧模型中(在 my very first question 中提出),我正在寻找没有重叠且时间相等的任何类次。但这有两个问题:
  • 如果我需要有人来代替我周二的 2 小时轮类,而我周四工作 4 小时,而乔周四工作 8 小时,我可以交换他的两个小时,他可以早点离开,我可以待一会儿之后。
  • 如果我有两个小时的类次,但我很乐意换一个小时以便准时到达机场,我想知道这周晚些时候是否会比我早一个小时到达,这样我就可以参加他轮类的那一部分。

  • 长话短说(为时已晚),我想要显然被称为 relative complement 的东西PersonA 的类次到 PersonB (基本上任何时候 PersonB 正在工作而 PersonA 不工作,无论类次是否在其他点重叠。)

    理想情况下,我会得到一组结果,其中包括 PersonB 正在工作而 PersonA 没有工作的位(上面提到的两个 1 小时轮类),以及整个轮类(带有一个特殊标签来指示它不能作为整体),这样 PersonA 会看到他正在轮类的一部分,而不会感到困惑,并认为 PersonB 恰好在工作两个一小时的类次。

    这一切听起来有点复杂。基本上我希望 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
    )
    )

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

    编辑:本来是相交的,但是如果你想要相对的补码,这就足够了。

    关于mysql - MySQL中的日期字段,查找所有不重叠的行并仅返回差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333340/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com