8

DataRow我有一个从源( a或 a SqlDataReader)获取日期属性的方法:

protected SqlDateTime GetSqlDateTimePropertyValue(string propertyName, object source)
{
  var objValue = GetPropertyValue(propertyName, source);
  var value = objValue == DBNull.Value ? null : (DateTime?)objValue;
  var sqlValue = new SqlDateTime();
  if (value.HasValue) sqlValue = value.Value;
  return sqlValue;
}

但转换似乎稍微改变了日期,所以我的测试总是失败。

有谁知道为什么这种方法会错误地转换?

在方法结束时,看起来转换为进行SqlDateTime了一些舍入:

value.Value.Ticks:        634698391707468296
sqlValue.Value.Ticks:     634698391707470000
4

3 回答 3

9

是的 - SQL ServerDATETIME的精度为 3.33 毫秒 - 但是 .NET 数据类型可以表示单个毫秒。

因此,您有时会遇到一些舍入问题。

在此处阅读有关DATETIME数据类型及其属性和怪癖的更多信息:

揭秘 SQL Server DATETIME 数据类型

此外,SQL Server 2008 引入了一系列新的与日期相关的数据类型——在此处阅读有关这些数据类型的更多信息:

SQL Server 2008 新的 DATETIME 数据类型

这些类型确实包括DATETIME2精确到 100ns 的数据类型。

于 2012-04-12T04:57:34.020 回答
3

这是 TSQL 日期时间的记录精度 - 请参阅MSDN的此链接中标题为“日期时间小数秒精度的舍入”的部分。引用部分:

日期时间值四舍五入为 0.000、0.003 或 0.007 秒的增量,如下表所示。

.NET 日期时间具有更好的精度。

此外,MS 建议使用较新的数据类型(例如 datetime2、日期、时间等)而不是日期时间。Sql Server 2008 引入的数据类型datetime2具有相似的精度 (100ns)(与 .NET 日期/时间结构相同),它还支持 ISO 8601 字符串格式,这将使从 .NET 日期/时间到 SQL 日期时间的转换更简单((即当您被迫使用文字而不是参数化查询时)并且无损失。

于 2012-04-12T05:00:16.950 回答
0

SqlDateTime 对象的精度低于 .NET DateTime 对象,因此在转换为 SQL 时会丢失一些精度。

于 2012-04-12T05:03:39.947 回答