LINQ to SQL按日期区间查询含时间戳数据的正确实现方法
解决方案
推荐方案(性能最优、无精度问题)
采用左闭右开区间的通用日期查询逻辑,兼容单天、跨天的所有查询场景:
SearchInvoicesNotSendToMydata(fromDateEdit.DateTime, toDateEdit.DateTime); public List<Invoices> SearchInvoicesNotSendToMydata(DateTime fromDate, DateTime toDate) { // 起始日期对齐到当日0点 DateTime start = fromDate.Date; // 结束日期对齐到次日0点 DateTime end = toDate.Date.AddDays(1); List<Invoices> invoices = db.Invoices .Where(p => p.Date >= start && p.Date < end) .ToList(); return invoices; }
该方案的优势:
- 无精度遗漏:不需要手动拼接23:59:59,避免漏掉毫秒级时间的记录,完全覆盖当日所有时间范围
- 性能优秀:查询条件直接作用于
Date字段,不会给字段附加运算函数,数据库可正常命中Date字段的索引 - 兼容性强:不管查询单天还是跨天日期区间,逻辑通用无需额外分支判断
可选方案(仅适合小数据量场景)
如果你使用EF框架,也可以通过截断字段时间部分实现,但该方案会对数据库字段附加函数运算,无法命中索引,数据量较大时性能较差:
// EF Core 写法 .Where(p => p.Date.Date >= fromDate.Date && p.Date.Date <= toDate.Date) // EF6 写法(需引用System.Data.Entity命名空间) .Where(p => DbFunctions.TruncateTime(p.Date) >= fromDate.Date && DbFunctions.TruncateTime(p.Date) <= toDate.Date)
内容的提问来源于stack exchange,提问作者rippergr
相关产品推荐
相关产品推荐

