c# SQL Server:DATETIME 数据类型

本文关键字:DATETIME 数据类型 Server SQL | 更新日期: 2023-09-27 18:19:28

我正在编写一个单元测试,它将带有DateTime参数的对象存储到DATETIME2 SQL Server数据库列中。然后,我创建一个名为 new_date_time 的临时DateTime对象,并将该值设置为 DateTime.Now

然后,new_date_time值用于更新以前的值,并且用于执行此操作的 SQL 查询将成功完成。

从数据库重新读取对象时,我收到天/小时/分钟的正确datetime值,但.Ticks值与new_date_time变量.Ticks属性不同。从读取调用返回的值将 .Ticks 属性的最后 4 位数字返回为零。

为什么会发生这种舍入会使我的Assert.AreEqual失败?? :)

谢谢

c# SQL Server:DATETIME 数据类型

我猜你在将日期写入 Sql Server 时正在使用Parameters.AddWithValue。从 MSDN 推断出的 CLR DateTime类型是SqlDbType.DateTime而不是SqlDbType.DateTime2因此在将日期写入数据库时会丢失精度。

将类型显式设置为 datetime2 将解决此问题。例如:

command.Parameters.AddWithValue("@now", DateTime.Now).SqlDbType = 
                                                       SqlDbType.DateTime2;

编辑

@marc_s在他的评论中提出了一个很好的观点:

你应该阅读(并拥抱!我们可以停止使用AddWithValue((吗?

为了避免这类问题困扰您,您可以养成在参数集合上使用 Add 方法的习惯,该方法在某些重载中获取SqlDbType,然后在此基础上设置 Value 属性,而不是使用 AddWithValue 方法:

command.Parameters.Add("@now", SqlDbType.DateTime2).Value = DateTime.Now;

也许您的数据库字段没有存储整个DateTime.Now值,因为它不够精确。为什么不在根据需要格式化日期后简单地比较日期呢?

例如:(未经测试(:

var databaseDate = d1.ToString("MM/dd/yyyy HH:mm:ss.fff");
var tempDate = d2.ToString("MM/dd/yyyy HH:mm:ss.fff");
Assert.AreEqual(databaseDate, tempDate);

我测试:使用Linq To Entities我的DateTime.Now正确保存到我的datetime2(7)和相等测试返回True

是否确定将正确的日期时间值传递给数据库?而不截断它?