在 SQL 服务器中复制计划而不重叠

Copying a schedule without overlap in SQL Server

我在 SQL 服务器中有一个简单的 table 用于安排房间预订。它只有三列:roomid, fromdate, todate.

我需要启用将一周(周日至周六)的现有预订复制到另一周,但前提是与现有预约没有重叠。

例如,如果在源周我有

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 不会被复制,因为与源周中的现有预订重叠。

请注意: 我知道如何检查一个预订是否与另一个预订重叠。但是,源日期范围内有多个预订,目标日期范围内有多个预订,问题是是否有一种智能方法可以根据目标范围检查源范围,而无需检查源范围内的每个预订与目标范围(例如通过将 table 链接到自身)。

这是一个原型查询,可以满足您的需求。

注意:它适用于比较一周的源数据和一周的目标数据

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

请注意,日期范围重叠逻辑来自:Determine Whether Two Date Ranges Overlap

此查询应该可以帮助您使周初过滤器正常工作:

-- Start of the current week
SELECT DATEADD(DD, 1 - DATEPART(DW, CONVERT( DATE, GETDATE())), CONVERT( DATE, GETDATE())) AS StartOfTheWeek

参考:Get first day of week in SQL Server

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