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

Entity Framework中如何正确查询SQL Server的datetime类型数据?

问题根源

SQL Server的datetime字段存储了毫秒精度值(如2024-04-18 19:47:36.337),但你构造的查询变量fecha仅到秒级,没有包含毫秒部分,直接用==匹配会因精度差异失败。

解决方案

1. 精确匹配(已知毫秒值时用)

直接构造包含完整毫秒的DateTime变量,和数据库存储值完全对齐:

public void obtenerFechaHarcodeada()
{
    DateTime fecha = new DateTime(2024, 4, 18, 19, 47, 36, 337);

    var registro = _dbContext.AssignmentRecords
                             .FirstOrDefault(r=> r.InitH == fecha);
}

2. 范围查询(推荐,适配绝大多数业务场景)

如果不需要精确到毫秒,可查询目标时间所在的区间(比如秒级区间),这种方式能利用字段索引,性能更优:

public void obtenerFechaPorRango()
{
    DateTime fechaStart = new DateTime(2024, 4, 18, 19, 47, 36);
    DateTime fechaEnd = fechaStart.AddSeconds(1);

    var registro = _dbContext.AssignmentRecords
                             .FirstOrDefault(r => r.InitH >= fechaStart && r.InitH < fechaEnd);
}

3. 截断精度后匹配

通过EF Core的内置函数,将数据库字段和查询值的精度统一截断到秒级后再匹配:

public void obtenerFechaTruncada()
{
    DateTime fecha = new DateTime(2024, 4, 18, 19, 47, 36);

    // EF Core 6+ 推荐使用 DateTrunc
    var registro = _dbContext.AssignmentRecords
                             .FirstOrDefault(r => EF.Functions.DateTrunc("second", r.InitH) == fecha);

    // 也可以手动匹配各时间部分
    var registro = _dbContext.AssignmentRecords
                             .FirstOrDefault(r => r.InitH.Year == fecha.Year && 
                                                  r.InitH.Month == fecha.Month && 
                                                  r.InitH.Day == fecha.Day && 
                                                  r.InitH.Hour == fecha.Hour && 
                                                  r.InitH.Minute == fecha.Minute && 
                                                  r.InitH.Second == fecha.Second);
}

内容的提问来源于stack exchange,提问作者Wrench 8Bits

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:13:14