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

如何正确查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:13