在SQL Server

时间:2017-11-12 17:51:44

标签: sql-server overlap schedule

我在SQL Server中有一个简单的表,用于安排预订房间。它只有三列: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的预订。 1/2/2017 11:00不会被复制,因为源周中的现有预订会有重叠。

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

1 个答案:

答案 0 :(得分:1)

这是一个原型查询,可以让你想要你想要的。

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

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脚本。