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
失败?? :)
谢谢
我猜你在将日期写入 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
。
是否确定将正确的日期时间值传递给数据库?而不截断它?