SqlParameter Datetime SqlValue 与 Value 的差值

本文关键字:Value Datetime SqlValue SqlParameter | 更新日期: 2023-09-27 18:35:22

>我有一个日期时间值要传递到SqlParameter中。

日期时间对象值

但是当传递给myCmd.Parameters.Add("@TrxDate", adt_TrxDate);

SqlParameter SqlValue & Value 属性是差值

发现它在执行查询时增加了一天。我在探查器中发现了这个问题,最后发现SqlParameter SqlValue & Value 属性是不同的值。为什么会这样,有什么想法吗?

SqlParameter Datetime SqlValue 与 Value 的差值

根本原因是,.NET DateTime比SQL Server的DateTime具有更高的精度。所以它是四舍五入的.SQL Server 2008 在病房上,DateTime2 支持更高的精度。

由于数据类型在 SQL 中为 DateTime,因此 SQL 参数将 .net DateTime 舍入到最接近的 Sql DateTime。由于它是舍入算法,它可能会添加.003,.007或删除,您可以查看此SO问题以获取更多详细信息。SQL Server中不需要的日期时间舍入,因此有时,如果添加微秒加起来,如果它在两天之间的边界上,它实际上可能会更改为第二天。

来自 MSDN,

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

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

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

所以我想如果您将参数类型更改为 DateTime2,它将保留实际时间。但是,除非您的 SQL Server 将列的类型设置为 DateTime2,否则此操作将不起作用。

您必须通过指定参数的SqlDbType来像下面这样使用:

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

如果DateTime,请使用SqlDbType.DateTime

或者您可以使用AddWithValue

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

您可以参考此线程以了解这两者之间的区别