我在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不会被复制,因为源周中的现有预订会有重叠。
请注意: 我知道如何检查一个预订是否与另一个预订重叠。但是,源日期范围内有多个预订,目标日期范围内有多个预订,问题是是否有一种智能方法可以检查源范围与目标范围,而不会检查源范围内的每个预订目标范围(例如,通过将表链接到自身)。
答案 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脚本。