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