SqlParameter的Datetime SqlValue与Value之间的差异

4
我有一个日期时间值要传递到SqlParameter中。 DateTime对象值 然而,当传递给myCmd.Parameters.Add("@TrxDate", adt_TrxDate);时, SqlParameter SqlValue & Value属性是不同的值 发现在执行查询时它会添加一天。我在分析器中发现了这个问题,最终发现SqlParameter SqlValue和Value属性是不同的值。为什么会发生这种情况,有什么想法吗?
2个回答

5

问题的根本原因是,.NET DateTime 的精度比 SQL Server 的 DateTime 更高。因此它会被四舍五入。从 SQL Server 2008 开始,DateTime2 支持更高的精度。

由于 SQL 数据类型是 DateTime,SQL 参数将 .net DateTime 四舍五入到最近的 Sql DateTime。由于这是一个四舍五入算法,它可能会添加 .003、.007 或删除一些微秒。您可以参考这个 SO 问题以获取更多细节:Undesired rounding of DateTime in SQL Server,所以有时,如果增加的微秒累加起来,它实际上可能会变成下一天,如果它在两天之间的边界上。

根据 MSDN,

https://msdn.microsoft.com/en-us/library/system.data.sqldbtype(v=vs.110).aspx

DateTime。日期和时间数据范围从1753年1月1日到9999年12月31日,精度为3.33毫秒。

DateTime2日期和时间数据。日期值范围是公元1年1月1日至公元9999年12月31日。时间值范围为00:00:00至23:59:59.9999999,精度为100纳秒。

所以我猜如果你将参数类型更改为DateTime2,它将保留实际时间。但是,除非你的SQL Server的列类型为DateTime2,否则这将没有效果。


是的。你说得对。SQL Server不支持2015-01-31 23:59:59.999。它会将该值舍入为2015-01-31 23:59:59.997。 - Kang Chian Gim

1

您需要通过为参数指定SqlDbType来使用以下内容:

   myCmd.Parameters.Add("@TrxDate",SqlDbType.Date).Value =adt_TrxDate;

如果是 DateTime,请使用 SqlDbType.DateTime

或者您可以使用 AddWithValue

  myCmd.Parameters.AddWithValue("@TrxDate",adt_TrxDate);

您可以参考此贴子了解这两者之间的区别。

抱歉,我之前尝试过了,但不起作用。请参考Akash Kava的答案。 - Kang Chian Gim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接