DateTime.Compare未按预期工作

时间:2015-08-18 22:41:11

标签: 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.Compare(cus.EntryDate, d));
}

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

2 个答案:

答案 0 :(得分:5)

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

According to MSDN,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;

答案 1 :(得分:1)

SQL Server的datetime值的精度为1 milicsecond,但精度为[大约] 3.33ms。此外,它实际上并非“舍入”毫秒计数。它的“舍入”算法是... byzantine,是善良的。但它至少记录在案。我可以在Round .NET DateTime milliseconds, so it can fit SQL Server milliseconds找到问题“https://stackoverflow.com/a/5318635/467473”的答案

  • 为您提供有关如何进行转换的文档,以及
  • datetime扩展方法,可将CLR System.DateTime值转换为其对应的SQL Server datetime等效值。

应该注意,由于两种表示之间的精度/准确度差异,这不是往返转换。