c# SQL Server:日期时间数据类型
Posted
技术标签:
【中文标题】c# SQL Server:日期时间数据类型【英文标题】:c# SQL Server : DATETIME datatype 【发布时间】:2014-10-20 08:59:09 【问题描述】:我正在编写一个单元测试,它将带有DateTime
参数的对象存储到DATETIME2
SQL Server 数据库列中。然后我创建一个名为new_date_time
的临时DateTime
对象并将该值设置为DateTime.Now
。
new_date_time
值随后用于更新先前的值,并且执行此操作的 SQL 查询成功完成。
从数据库中重新读取对象时,我收到了正确的 datetime
天/小时/分钟值,但 .Ticks
值与 new_date_time
变量 .Ticks
属性不同。从 read 调用返回的值将 .Ticks
属性的最后 4 位数字返回为零。
为什么发生这种舍入使我的Assert.AreEqual
失败? :)
谢谢
【问题讨论】:
您的单元测试是否会导致对数据库的查询?您的单元测试不应依赖于数据库或更改内容。见this post。 是的,我正在查询数据库,它使用 datetime 类型的临时变量来验证更新命令是否正在更新数据库中的正确数据 DateTime2 列是如何定义的?您只使用datetime2
还是datetime2(n)
?
datetime2 默认精度据称是最大精度
您在 SQL 中使用Getdate
(或getutcdate
)吗?
【参考方案1】:
我猜你在将日期写入 Sql Server 时使用的是Parameters.AddWithValue
。从 MSDN 推断出的 CLR DateTime
的类型是 SqlDbType.DateTime
和 not SqlDbType.DateTime2
,因此在将日期写入数据库时会丢失精度。
将类型显式设置为datetime2
将解决问题。例如:
command.Parameters.AddWithValue("@now", DateTime.Now).SqlDbType =
SqlDbType.DateTime2;
编辑
@marc_s 的评论说得很好:
你应该阅读(并接受!)Can we stop using AddWithValue() already?
为避免此类问题困扰您,您可以养成在参数集合上使用 Add
方法的习惯,该方法在某些重载中采用 SqlDbType
,然后在其上设置 Value
属性比使用AddWithValue
方法:
command.Parameters.Add("@now", SqlDbType.DateTime2).Value = DateTime.Now;
【讨论】:
这看起来可能是罪魁祸首... :) 好的,我会试试这个,因为我最初使用的旧日期时间类型的代码不起作用,这似乎是合乎逻辑的问题。 不用担心@Dizzle,很高兴它有帮助。 你应该阅读(并拥抱!)Can we stop using AddWithValue() already? @marc_s - 当您提出一个好观点时,我已经对答案添加了一个编辑。谢谢!【参考方案2】:也许您的数据库字段没有存储您的整个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
。
您确定将 正确 日期时间值传递给数据库吗?不截断它?
【讨论】:
根据:msdn.microsoft.com/en-us/library/bb677335.aspx默认精度为最大精度 准确存储 .net 日期时间对象所需的精度是多少? 是的,我确定我传递了正确的对象,因为它被修改了,它只是 .Ticks 值在与 Assert 进行比较时没有被反映为相同的值 使用HH
而不是hh
。 HH
是 24 小时制,hh
是 12 小时制。以上是关于c# SQL Server:日期时间数据类型的主要内容,如果未能解决你的问题,请参考以下文章
使用哪种 SQL Server sql 数据类型来保留 UTC 日期时间
Microsoft SQL Server 数据库/Visual Studio C#:日期处理