You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ正确判断日期范围与数据库记录是否重叠

现有逻辑的遗漏点

你写的判断条件仅匹配了「用户所选区间完全落在已有记录区间内部」这一种重叠场景,对应判定规则是a >= s && b <= f,漏掉了以下三类重叠情况:

  • 用户所选区间起点落在已有区间内,但终点超出已有区间结束时间(s <= a <= f && b > f)
  • 用户所选区间终点落在已有区间内,但起点早于已有区间开始时间(a < s && s <= b <= f)
  • 用户所选区间完全包裹住已有记录区间(a < s && b > f)
正确的重叠判定规则

判断两个区间重叠不需要枚举所有重叠场景,只要反向排除绝对不会重叠的两种情况即可,其余场景全部属于重叠:

  1. 用户所选区间的结束时间早于已有记录的开始时间:b < s
  2. 用户所选区间的开始时间晚于已有记录的结束时间: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:42:44