C# 存储在SQL Server中时,my DateTime中的毫秒数会发生更改
我有这样生成的日期时间:C# 存储在SQL Server中时,my DateTime中的毫秒数会发生更改,c#,.net,sql-server,C#,.net,Sql Server,我有这样生成的日期时间: DateTime myDateTime = DateTime.Now; 然后,我使用实体框架将其存储在数据库中(在DateTimetyped列中)。然后我用OData(WCF数据服务)检索它 当它进入时间段时,值为:09:30:03.0196095 当它出现时,时间值为:09:30:03.0200000 这样做的净效果是,保存前的毫秒数为19,重新加载后的毫秒数为20 因此,当我稍后在代码中进行比较时,它在应该相等的地方失败 SQL Server是否没有.NET那么精
DateTime myDateTime = DateTime.Now;
然后,我使用实体框架将其存储在数据库中(在DateTime
typed列中)。然后我用OData(WCF数据服务)检索它
当它进入时间段时,值为:09:30:03.0196095
当它出现时,时间值为:09:30:03.0200000
这样做的净效果是,保存前的毫秒数为19,重新加载后的毫秒数为20
因此,当我稍后在代码中进行比较时,它在应该相等的地方失败
SQL Server是否没有.NET那么精确?还是实体框架或OData把事情搞砸了
我将只截断毫秒(我真的不需要它们)。但是我想知道为什么会发生这种情况。SQL Server中的日期时间精度是毫秒(
.fff
)。因此,0.0196将四舍五入到0.020。如果可以使用,则可以获得更高的精度。这实际上取决于您使用的SQL server版本
日期时间字段的分辨率为小数点后3位:例如:2011-06-06 23:59:59.997
,精度仅在3.33毫秒以内
在您的情况下,09:30:03.0196095在存储时被四舍五入为09:30:03.020
从SQL 2008开始,添加了其他数据类型以提供更多细节,例如datetime2,它最多有7位小数,精确到100ns以内
有关更多信息,请参见以下内容:
我认为,如果毫秒不重要,最好在将其存储到SQL server之前将其舍入到秒。这是由于SQL
datetime
类型的精度。根据msdn:
日期时间值四舍五入为.000、.003或.007秒的增量
查看的日期时间分数秒精度的舍入部分,您将了解舍入是如何完成的
正如其他人所指出的,您可以使用而不是datetime
来提高精度:
时间范围为datetime
00:00:00到23:59:59.997
时间范围是datetime2
00:00:00到23:59:59.999999
System.Data
并导入System.Data.SqlTypes
命名空间。然后可以使用SqlDateTime
结构为您进行转换:
DateTime someDate = new SqlDateTime(DateTime.Now).Value;
这将把值转换为SQL记号,然后再转换回.NET记号,包括精度损失。:)
警告一句,这将丢失原始
DateTime
结构的种类(即Utc
,Local
)。这种转换也不仅仅是四舍五入,还有一个完整的转换,包括勾号计算、MaxTime
changes等。。因此,如果您依赖于DateTime
中的特定指标,请不要使用此选项,因为它们可能会丢失。您是如何进行比较的?这是一种不同的精度。请参阅旁边的相关问题。您使用的是哪个版本的SQL Server?如果2008datetime2
具有更高的精度,仅截断ms可能不够。您可以将09:30:03.9999999
四舍五入为09:30:04.000000
@Joel-在第一次将其保存到数据库之前,我会先计算毫秒数。因此,第二次它将匹配。唉,DateTime2在OData中不受支持。所以我不能用它。datetime2对我来说仍然是毫秒小数。为什么?