如何判断新预订的起止日期是否与已有预订的日期间隔存在重叠
预订时间段重叠校验问题解决方案
现有代码问题根因
你当前编写的判断逻辑newBookingfrom >= oldBooking.From && newBookingTo <= oldBooking.To仅能识别新预订完全包含在已有预订内部这一种重叠场景,遗漏了大量其他重叠情况,包括:
- 新预订完全包裹已有预订(即你示例中新预订2021-10-09至2021-10-16、已有预订2021-10-10至2021-10-15的场景,现有逻辑无法识别重叠)
- 新预订起始时间落在已有预订区间内、结束时间晚于已有预订结束时间
- 新预订结束时间落在已有预订区间内、起始时间早于已有预订起始时间
正确的重叠判断逻辑
判断两个时间段是否重叠更简单的方式是反向推导:两个时间段完全不重叠的唯一条件是「新预订结束时间早等于已有预订开始时间」或「新预订开始时间晚等于已有预订结束时间」,对该条件取反即可得到通用的重叠判断规则:newBookingFrom < oldBooking.To && newBookingTo > oldBooking.From
边界调整提示:如果你的业务允许预订起止日重合(比如酒店预订场景中10月15日退房、10月15日可办理新入住),可以将运算符调整为
<=和>=匹配业务规则。
优化后的实现代码
你不需要查询所有重叠的预订记录,只要判断是否存在任意一条重叠记录即可,使用Any()方法可以提前终止遍历,数据量大时性能更优:
// 判断是否存在重叠预订 bool hasOverlappedBooking = _bookingRepository.GetAll() .Any(oldBooking => newBookingfrom < oldBooking.To && newBookingTo > oldBooking.From); // 存在重叠直接返回false if (hasOverlappedBooking) { return false; }
内容的提问来源于stack exchange,提问作者KTOV
相关产品推荐
相关产品推荐

