毫秒在我的DateTime更改时,存储在SQL Server
本文关键字:存储 SQL Server 我的 DateTime | 更新日期: 2023-09-27 18:11:37
我有一个像这样生成的日期时间:
DateTime myDateTime = DateTime.Now;
然后使用实体框架将其存储在数据库中(在DateTime
类型列中)。然后我用OData (WCF数据服务)检索它。
当它进入TimeOfDay值时:09:30:03.0196095
输出时TimeOfDay值为:09:30:03.0200000
这样做的最终效果是,保存前的毫秒数为19,重新加载后的毫秒数为20。
所以当我稍后在代码中进行比较时,它在应该相等的地方失败了
SQL Server没有。net那么精确吗?或者是实体框架或OData搞砸了这个?
我将截断毫秒(我真的不需要它们)。但是我想知道为什么会这样
这取决于你使用的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我认为你最好的选择是提供舍入到秒之前存储在SQL服务器,如果毫秒是不重要的。
这是由于SQL datetime
类型的精度。根据msdn:
日期时间值四舍五入为0.00000、0.003或0.007秒的增量
查看此msdn页面的 datetime小数秒精度的舍入部分,您将了解舍入是如何完成的。
根据其他人的指示,您可以使用datetime2
而不是datetime
来获得更好的精度:
-
datetime
时间范围为00:00:00 through 23:59:59.997
-
datetime2
时间范围为00:00:00 through 23:59:59.9999999
对于那些没有能力在SQL中使用DateTime2的人(例如:像我这样使用由单独系统生成的表,对于单个问题进行更改将是昂贵的),有一个简单的代码修改将为您进行舍入。
引用System.Data
并导入System.Data.SqlTypes
命名空间。然后,您可以使用SqlDateTime
结构为您进行转换:
DateTime someDate = new SqlDateTime(DateTime.Now).Value;
这将把值转换成SQL刻度,然后再转换回。net刻度,包括精度的损失。:)
一个警告,这将失去原DateTime
结构(即Utc
, Local
)的Kind
。这种转换也不是简单的舍入,有一个完整的转换,包括刻度计算,MaxTime
的变化等。因此,如果您依赖DateTime
中的特定指标,则不要使用此功能,因为它们可能会丢失。
SQL Server中DateTime的精度为毫秒(.fff
)。所以0.0196可以四舍五入到0.020。如果可以使用datetime2,则可以获得更高的精度。