如何使用LINQ正确判断日期范围与数据库记录是否重叠
现有逻辑的遗漏点
你写的判断条件仅匹配了「用户所选区间完全落在已有记录区间内部」这一种重叠场景,对应判定规则是a >= s && b <= f,漏掉了以下三类重叠情况:
- 用户所选区间起点落在已有区间内,但终点超出已有区间结束时间(
s <= a <= f && b > f) - 用户所选区间终点落在已有区间内,但起点早于已有区间开始时间(
a < s && s <= b <= f) - 用户所选区间完全包裹住已有记录区间(
a < s && b > f)
正确的重叠判定规则
判断两个区间重叠不需要枚举所有重叠场景,只要反向排除绝对不会重叠的两种情况即可,其余场景全部属于重叠:
- 用户所选区间的结束时间早于已有记录的开始时间:
b < s - 用户所选区间的开始时间晚于已有记录的结束时间:
a > f
对应你给出的场景示例里标记为NO的情况,刚好完全匹配以上两种不重叠的判定。
修正后的LINQ代码
var overlap = _db.StayRooms .Where(x => x.tenant == LoginAccount // 排除两种不重叠场景,剩余结果即为存在重叠的记录 && !(dormapplication.Edate < x.Sdate || dormapplication.Sdate > x.Edate) ) .Select(y => y.days) .FirstOrDefault();
如果你的业务规则里区间端点重合(比如用户选的结束日期和已有记录的开始日期是同一天)也算作重叠,把判断里的<和>替换成<=和>=即可。
内容的提问来源于stack exchange,提问作者georgetovrea
相关产品推荐
相关产品推荐

