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

查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:28:27