C# DateTime.Compare未按预期工作

C# DateTime.Compare未按预期工作,c#,asp.net,c#-4.0,C#,Asp.net,C# 4.0,我用下面的方法插入客户 DateTime d = DateTime.Now; foreach(Customer cus in CustomerList) { cus.EntryDate = d; } SaveToDatbase(CustomerList); 日期已成功保存为正确的输入日期,但当我检索回数据并将其与变量d进行比较时,它不匹配 foreach(Customer cus in GetFromDatabase()) { Response.Write(DateTime

我用下面的方法插入客户

DateTime d = DateTime.Now;

foreach(Customer cus in CustomerList)
{
    cus.EntryDate = d;
}

SaveToDatbase(CustomerList);
日期已成功保存为正确的输入日期,但当我检索回数据并将其与变量d进行比较时,它不匹配

foreach(Customer cus in GetFromDatabase())
{
    Response.Write(DateTime.Compare(cus.EntryDate, d));
}

输出为1而不是0。我检查了插入的数据,它将d变量值与毫秒匹配。日期存储在sql server数据库中。我意识到的一件事是,如果我将cus.EntryDate和d的毫秒数重置为0,则输出为0。我做错了什么

SQL Server的
datetime
类型的分辨率低于.NET。当您使用
DateTime.Now
直接(不舍入到最接近的秒)时,您将看到毫秒或刻度(100纳秒)部分的差异

,SQL Server中的
datetime
类型的分辨率约为3毫秒(具体来说:
2015-08-18 15:49:10.000
->
2015-08-18 15:49:10.003
->
2015-08-18 15:49:10.007
->
2015-08-18 15:49:10.010
)而.NET的
DateTime
类型的分辨率为100纳秒

如果您想保持某种平等性,我建议在插入数据库之前将
DateTime
四舍五入到最接近的秒数:

DateTime now = DateTime.Now;
now = new DateTime(
    now.Ticks - ( now.Ticks % TimeSpan.TicksPerSecond ),
    now.Kind
);

foreach(Customer cus in customerList) cus.EntryDate = now;

SQL Server的
datetime
值的精度为1毫秒秒,但精度[约]3.33毫秒。此外,它实际上并不“舍入”毫秒计数。它的“舍入”算法是…拜占庭式的,是一种。但至少有文件记载。我对这个问题的回答是,“,你可以随意找到

  • 向您指出如何执行转换的文档,以及
  • 具有一个
    datetime
    扩展方法,该方法将CLR
    System.datetime
    值转换为相应的SQL Server
    datetime
    等效值

需要注意的是,由于两种表示法之间的精度/精度差异,这不是往返转换。

您将其存储在哪个数据库中?有些不具备完美逼真地存储
DateTime
的分辨率。我使用Sql Server。我验证了保存的数据与d变量匹配。那么将毫秒重置为0并进行比较的最佳选项是什么?我简化了上面的示例,但对于实际应用程序,我处理的是发票日期。我不需要毫秒精度,但需要秒精度,因为有时两个人会同时添加两张不同的发票。然后,我的唯一标识将是输入日期。@user3587180我更新了我的响应,以显示如何将
DateTime
实例的亚秒细节归零。旁注:我认为创建
新的DateTime(now.Year,now.Month,now.Days…Seconds)
比创建
%
更具可读性。。。也有很多人不同意-.SQLServer的
datetime
准确度高达3⅓ms,以及.NET的
日期时间
到100ns,因此,如果您需要小于10ms的精度,那么四舍五入到该精度或更小的精度是最简单的处理方法。如果您确实需要这样的准确性,那么SQLServer2008及更高版本中的
datetime2
将满足这一需要。