Sql server 在SQL Server中复制没有重叠的计划

Sql server 在SQL Server中复制没有重叠的计划,sql-server,overlap,schedule,Sql Server,Overlap,Schedule,我在SQL Server中有一个简单的表,用于安排房间预订。它只有三列:roomid、fromdate、todate 我需要允许将一周(Sun Sat)的现有预订复制到另一周,但前提是与现有预订没有重叠 例如,如果在源代码周中 1/1/2017 10:00-11:00 1/2/2017 11:00-12:00 1/3/2017 12:00-13:00 1/2/2017 09:00-11:30 在目的地周我有 1/1/2017 10:00-11:00 1/2/2017 11:00-12:00

我在SQL Server中有一个简单的表,用于安排房间预订。它只有三列:
roomid、fromdate、todate

我需要允许将一周(Sun Sat)的现有预订复制到另一周,但前提是与现有预订没有重叠

例如,如果在源代码周中

1/1/2017 10:00-11:00
1/2/2017 11:00-12:00
1/3/2017 12:00-13:00
1/2/2017 09:00-11:30
在目的地周我有

1/1/2017 10:00-11:00
1/2/2017 11:00-12:00
1/3/2017 12:00-13:00
1/2/2017 09:00-11:30
仅复制1/1和1/3的预订。2017年1月2日11:00将不会被复制,因为这将与源周的现有预订重叠

请注意:
我知道如何检查一个预订是否与另一个预订重叠。但是,在源日期范围内有多个预订,在目标日期范围内有多个预订,问题是是否有一种聪明的方法来对照目标范围检查源范围,而无需对照目标范围内的每个预订检查源范围内的每个预订(例如,通过将表链接到表本身).

这是一个原型查询,应该可以得到您想要的结果

注意:它用于将一周的源数据与一周的目标数据进行比较

SELECT *
FROM
        -- Current week appointments with +1 week dates
        ( SELECT roomid, DATEADD( week, 1, fromdate ) AS FutureFrom, DATEADD( week, 1, todate ) AS FutureTo
        FROM data
        WHERE [current week filter] ) AS CurrentWeek
    LEFT JOIN
            -- Next week appointments
            ( SELECT roomid, fromdate, todate
            FROM data
            WHERE [next week filter] ) AS NextWeek
        ON (FutureFrom < todate)  and  (FutureTo > fromdate) AND CurrentWeek.roomid = NextWeek.roomid
-- Only return CurrentWeek appointments where appointment date range does not overlap with next week's one
WHERE NextWeek.roomid IS NULL
参考:


注意:如果您想要一个工作样本,您需要提供一个包含更多样本数据的完整DDL脚本。

问题的可能重复之处不是如何检查日期重叠。要澄清的是,问题是是否有一种智能的方法可以将一个时段的所有日期与另一个时段的所有日期进行对比,而不必分别进行检查。我不明白你的意思,也许你可以提供一个额外的示例。从来源处进行预订很简单,在其“开始日期”和“开始日期”中添加一个月,并查看这些新日期与目标时段之间是否存在冲突,然后对源时段中的每个现有预订执行此操作。然而,由于成百上千的预订,这需要很长时间。问题是是否有一种更简单、更快捷的方法,例如将表链接到表本身。我试过了,但没有弄明白。你所描述的可以在一个查询中完成,这就是你正在努力解决的问题吗?查询相对简单:选择一周的记录,使用
DATEADD
将一周添加到日期-这是您的第一个查询,然后在选择下一周的位置编写另一个查询,然后离开并加入两个要求,只插入在第二个查询中未找到匹配项的记录。效果很好。最后一行中的小编辑应为NULL,而不是NULL@user1480192-固定