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.DateTimenot 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 而不是hhHH 是 24 小时制,hh 是 12 小时制。

以上是关于c# SQL Server:日期时间数据类型的主要内容,如果未能解决你的问题,请参考以下文章

使用哪种 SQL Server sql 数据类型来保留 UTC 日期时间

Microsoft SQL Server 数据库/Visual Studio C#:日期处理

在sql server2008中的日期类型是啥

将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”

在SQL-Server中关于日期的数据类型都有哪些?

C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()