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服务器中.
对于那些没有能力在 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结构(即Utc,Local)的 。这种转换也不是简单的四舍五入,而是一个完整的转换,包括分时计算、MaxTime变化等。因此,如果您依赖特定指标,请不要使用它,DateTime因为它们可能会丢失。
| 归档时间: |
|
| 查看次数: |
18347 次 |
| 最近记录: |