Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储在SQL Server中时,my DateTime中的毫秒数会发生更改_C#_.net_Sql Server - Fatal编程技术网

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

对于那些无法在SQL中使用DateTime2的人(例如:像我一样,使用由单独系统生成的表,这一问题的更改成本很高),有一个简单的代码修改可以为您进行取整

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

DateTime someDate = new SqlDateTime(DateTime.Now).Value;
这将把值转换为SQL记号,然后再转换回.NET记号,包括精度损失。:)


警告一句,这将丢失原始
DateTime
结构的
种类(即
Utc
Local
)。这种转换也不仅仅是四舍五入,还有一个完整的转换,包括勾号计算、
MaxTime
changes等。。因此,如果您依赖于
DateTime
中的特定指标,请不要使用此选项,因为它们可能会丢失。

您是如何进行比较的?这是一种不同的精度。请参阅旁边的相关问题。您使用的是哪个版本的SQL Server?如果2008
datetime2
具有更高的精度,仅截断ms可能不够。您可以将
09:30:03.9999999
四舍五入为
09:30:04.000000
@Joel-在第一次将其保存到数据库之前,我会先计算毫秒数。因此,第二次它将匹配。唉,DateTime2在OData中不受支持。所以我不能用它。datetime2对我来说仍然是毫秒小数。为什么?