查询SQL Server时C# DateTime精度转换问题解决方案咨询
解决SQL Server datetime与C# DateTime精度不匹配的查询问题
针对你遇到的SQL Server datetime(3位毫秒精度)与C# DateTime(7位精度)比较时的舍入错误问题,提供以下两种可行方案:
方案一:截断C# DateTime到3位毫秒精度
直接修改比较用的DateTime,去掉多余的精度,确保传入SQL Server的参数只有3位毫秒。可以通过操作ticks实现(C#中1毫秒=10000 ticks):
// 自定义方法:截断DateTime到3位毫秒 DateTime TruncateToThreeMilliseconds(DateTime dt) { // 去掉超出3位毫秒的ticks(10000 ticks = 1毫秒) return dt.AddTicks(-(dt.Ticks % 10000)); } // 使用示例 DateTime comparisonDateTime = TruncateToThreeMilliseconds(lastSuccessfulPullDateTime); qryAllCartonsToSync = schRepos.SearchFor(o => o.OrderHeader.StoreFrontId == _storeFront.Id && o.ShipDateTimeUTC > comparisonDateTime && o.IsReturn == false );
处理后,comparisonDateTime的毫秒部分只会保留3位,传入SQL Server后不会触发数据库值的精度转换,避免舍入导致的错误匹配。
方案二:通过EF SQL函数强制转换比较值精度
利用EF的SQL函数,将比较值强制转换为SQL Server的datetime类型,让数据库用相同精度进行比较:
EF6 示例:
using System.Data.Entity.SqlServer; qryAllCartonsToSync = schRepos.SearchFor(o => o.OrderHeader.StoreFrontId == _storeFront.Id // 将比较值转为SQL datetime类型,避免数据库值向上舍入 && o.ShipDateTimeUTC > SqlFunctions.Convert(comparisonDateTime, System.Data.DbType.DateTime) && o.IsReturn == false );
EF Core 示例:
using Microsoft.EntityFrameworkCore; qryAllCartonsToSync = schRepos.SearchFor(o => o.OrderHeader.StoreFrontId == _storeFront.Id && o.ShipDateTimeUTC > EF.Functions.Convert<DateTime>(comparisonDateTime) && o.IsReturn == false );
这种方式会让SQL Server将比较参数转换为datetime(3位精度),而非将数据库的datetime值转换为更高精度的类型,从根源上避免舍入逻辑影响查询结果。
内容的提问来源于stack exchange,提问作者crichavin
相关产品推荐
相关产品推荐

