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
相关产品推荐
相关产品推荐

