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

.NET Core API如何根据起止DateTime筛选可用Venue场地

核心判定逻辑

两个时间段存在预约冲突的充要条件为:已有预约的开始时间 < 用户请求的结束时间 且 已有预约的结束时间 > 用户请求的开始时间,只要满足该条件,说明对应场地在用户选定的时间段内已被占用,需要排除。

实现代码

假设你的数据库上下文实例为_context,包含Venues(场地表)和VenueReservations(预约记录表)两个数据集,参考代码如下:

// 1. 基础入参校验
if (userInputEndTime <= userInputStartTime)
{
    // 此处返回参数错误响应,示例:return BadRequest("结束时间必须晚于开始时间");
}

// 2. 核心查询语句(EF Core 直接查询数据库场景)
var availableVenues = await _context.Venues
    .Where(venue => !_context.VenueReservations
        .Any(reservation => 
            reservation.VenueId == venue.Id
            && reservation.StartDateTime < userInputEndTime
            && reservation.EndDateTime > userInputStartTime
        ))
    .ToListAsync();

如果是内存数据筛选场景,只需要将_context.VenueReservations替换为内存中的预约列表即可。

注意事项

  • 时间时区统一:建议所有时间统一使用UTC时间存储和传参,避免时区偏移导致的判断错误。
  • 额外业务过滤:如果你的预约存在已取消、已过期等无效状态,可以在Any方法的判断条件中追加状态过滤规则,比如追加&& reservation.IsValid == true。
  • 性能优化:数据量较大时,可给VenueReservations表的VenueId、StartDateTime、EndDateTime字段添加联合索引,提升查询效率。

内容的提问来源于stack exchange,提问作者Jan-Derk de Vries

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:09:08