DateTime.Compare 未按预期工作
DateTime.Compare is not working as expected
我正在通过以下方式插入客户。
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 服务器数据库中。我意识到的一件事是,如果我将 cus.EntryDate 和 d 的毫秒数重置为 0,则输出为 0。我在这里做错了什么?
SQL 服务器的 datetime
类型的分辨率低于 .NET 的分辨率。当您直接使用 DateTime.Now
(不四舍五入到最接近的秒)时,您会看到毫秒或刻度(100 纳秒)部分的差异。
According to MSDN,SQL 服务器中的 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 服务器的 datetime
值的 precision 为 1 毫秒,但 accuracy 为 [approximately ] 3.33毫秒。此外,它实际上并不 "round" 毫秒数。它的 "rounding" 算法是……拜占庭式的。但它至少是有记录的。我对问题的回答,“Round .NET DateTime milliseconds, so it can fit SQL Server milliseconds", which you can find at ,将
- 将您指向有关如何执行转换的文档,并且
- 有一个
datetime
扩展方法,可以将 CLR System.DateTime
值转换为其对应的 SQL 服务器 datetime
等价物。
需要注意的是,由于两种表示之间的 precision/accuracy 差异,这不是往返转换。
我正在通过以下方式插入客户。
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 服务器数据库中。我意识到的一件事是,如果我将 cus.EntryDate 和 d 的毫秒数重置为 0,则输出为 0。我在这里做错了什么?
SQL 服务器的 datetime
类型的分辨率低于 .NET 的分辨率。当您直接使用 DateTime.Now
(不四舍五入到最接近的秒)时,您会看到毫秒或刻度(100 纳秒)部分的差异。
According to MSDN,SQL 服务器中的 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 服务器的 datetime
值的 precision 为 1 毫秒,但 accuracy 为 [approximately ] 3.33毫秒。此外,它实际上并不 "round" 毫秒数。它的 "rounding" 算法是……拜占庭式的。但它至少是有记录的。我对问题的回答,“Round .NET DateTime milliseconds, so it can fit SQL Server milliseconds", which you can find at ,将
- 将您指向有关如何执行转换的文档,并且
- 有一个
datetime
扩展方法,可以将 CLRSystem.DateTime
值转换为其对应的 SQL 服务器datetime
等价物。
需要注意的是,由于两种表示之间的 precision/accuracy 差异,这不是往返转换。