存储在SQL Server中时,我的DateTime中的毫秒数会发生变化

Vac*_*ano 32 .net c# sql-server

我有一个像这样生成的日期时间:

DateTime myDateTime = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

然后,我将其存储在DateTime具有Entity Framework 的数据库(在类型列中)中.然后我用OData(WCF数据服务)检索它.

当它进入TimeOfDay值时:09:30:03.0196095

当它出现时,TimeOfDay值为:09:30:03.0200000

这样做的净效果使得Milliseconds在保存前被视为19,在重新加载后被视为20.

因此,当我稍后在我的代码中进行比较时,它会在应该相等的地方失败.

SQL Server的精度不如.NET吗?或者实体框架或OData搞砸了吗?

我将截断毫秒(我真的不需要它们).但我想知道为什么会这样.

Not*_*tMe 44

这实际上取决于您使用的SQL Server的版本.

日期时间字段的分辨率为3位小数:例如:2011-06-06 23:59:59.997并且仅精确到3.33 ms.

在您的情况下,09:30:03.0196095正在被存储到09:30:03.020.

从SQL 2008开始,添加了其他数据类型以提供更多详细信息,例如datetime2,其最多包含7个小数位,精确到100ns.

有关更多信息,请参阅以下内容

http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

我认为最好的办法是在第二个PRIOR中提供舍入,以便在毫秒不重要的情况下将其存储在SQL服务器中.


Oti*_*iel 20

这是由于SQL datetime类型的精确性.根据msdn:

日期时间值四舍五入为.000,.003或.007秒的增量

查看此msdn页面的日期时间小数秒精度部分,您将了解舍入的完成方式.

如其他人所示,您可以使用datetime2而不是datetime具有更好的精度:

  • datetime 时间范围是 00:00:00 through 23:59:59.997
  • datetime2 时间范围是 00:00:00 through 23:59:59.9999999


And*_*ous 9

对于那些没有能力在 SQL 中使用 DateTime2 的人(例如:像我一样使用由单独的系统生成的表,对于这个单一的问题进行更改会很昂贵),有一个简单的代码修改将进行四舍五入为你。

引用System.Data并导入System.Data.SqlTypes命名空间。然后,您可以使用该SqlDateTime结构为您进行转换:

DateTime someDate = new SqlDateTime(DateTime.Now).Value;
Run Code Online (Sandbox Code Playgroud)

这会将值转换为 SQL 刻度,然后再转换回 .NET 刻度,包括精度损失。:)

警告一句,这将失去Kind原始DateTime结构(即UtcLocal)的 。这种转换也不是简单的四舍五入,而是一个完整的转换,包括分时计算、MaxTime变化等。因此,如果您依赖特定指标,请不要使用它,DateTime因为它们可能会丢失。