如何正确查询DateTime类型字段的两个日期区间数据?
问题分析与解决方案
核心问题:时间部分的影响
你遇到的结果遗漏问题确实是时间部分导致的。日期选择器返回的FromDate和EndDate通常是不带具体时间的DateTime(默认时间为00:00:00),但数据库中ExamDate是包含具体时分秒的完整DateTime类型。如果直接用x.ExamDate <= searcher.EndDate,所有EndDate当天非凌晨时段的记录都会被过滤掉——比如2024-05-02 14:30:00会被判定为大于2024-05-02 00:00:00,从而被排除。
修正后的代码
调整结束日期的判断逻辑:将EndDate加1天,然后用x.ExamDate < 结束日期+1天,这样就能完整包含EndDate当天所有时间的记录。起始日期保持>= FromDate的判断,确保包含起始日凌晨及之后的所有记录。
var query = _repository.GetQueryable<Test>() .Include(s => s.Sector) .Include(s => s.Subject) .Include(s => s.TestType) .Where(x => x.CenterId == _user.CenterId); if (searcher?.GradeId is not null) query = query.Where(x => x.SectorId == searcher.GradeId); if (searcher?.SubjectId is not null) query = query.Where(s => s.SubjectId == searcher.SubjectId); if (searcher.FromDate.HasValue) { var fromDate = searcher.FromDate.Value; if (searcher.EndDate.HasValue) { // 结束日期加1天,确保覆盖当天所有时间的记录 var endDate = searcher.EndDate.Value.AddDays(1); query = query.Where(x => x.ExamDate >= fromDate && x.ExamDate < endDate); } else { // 仅指定起始日期时,取所有>=起始日期的记录 query = query.Where(x => x.ExamDate >= fromDate); } }
额外说明
- 不推荐用
EndDate.AddHours(23).AddMinutes(59).AddSeconds(59)的方式:这种写法会漏掉毫秒级的记录(比如2024-05-02 23:59:59.999),而< EndDate+1天的逻辑能覆盖所有时间精度的场景,更严谨。 - 如果你的日期选择器支持选择具体时间范围,直接传入带时间的
FromDate和EndDate即可,但大多数业务场景下用户仅选择日期,上述方案更通用。
内容的提问来源于stack exchange,提问作者Zidane
相关产品推荐
相关产品推荐

