Sql Server 中的 DateTime 插入更改值
Posted
技术标签:
【中文标题】Sql Server 中的 DateTime 插入更改值【英文标题】:DateTime inserted in SqlServer changes value 【发布时间】:2013-10-07 13:29:20 【问题描述】:当我插入这些值时
09/30/2013 05:04:56.599
09/30/2013 05:04:56.599
09/30/2013 05:04:56.599
09/30/2013 05:04:57.082
在SqlServer数据库中,毫秒值以一种奇怪的方式变化
2013-09-30 05:04:56.600
2013-09-30 05:04:56.600
2013-09-30 05:04:56.600
2013-09-30 05:04:57.083
怎么了?
编辑: 相关代码:
com = new SqlCommand();
com.Connection = con;
com.CommandText = @"INSERT INTO [AuthSourceTimings]
([FileName]
,[JobID]
,[JobCreationTime]
,[JobSendTime]
,[JobAckTime]
,[JobDoneTime])
VALUES
(@FileName
,@JobID
,@JobCreationTime
,@JobSendTime
,@JobAckTime
,@JobDoneTime)
";
com.Parameters.AddWithValue("@FileName", fileName);
com.Parameters.AddWithValue("@JobID", t.JobID);
com.Parameters.AddWithValue("@JobCreationTime", t.JobCreationTime == DateTime.MinValue ? (object)DBNull.Value : (object)t.JobCreationTime);
com.Parameters.AddWithValue("@JobSendTime", t.JobSendTime == DateTime.MinValue ? (object)DBNull.Value : (object)t.JobSendTime);
com.Parameters.AddWithValue("@JobAckTime", t.JobAcknowledgementTime == DateTime.MinValue ? (object)DBNull.Value : (object)t.JobAcknowledgementTime);
com.Parameters.AddWithValue("@JobDoneTime", t.JobCompletionTime == DateTime.MinValue ? (object)DBNull.Value : (object)t.JobCompletionTime);
com.ExecuteNonQuery();
【问题讨论】:
好问题 +1,您可以将代码从您发送到 db 的位置发布吗? 如果您使用的是 sql server 2008 或更高版本,请使用 datetime2 还要检查 ***.com/questions/7823966/… +1 因为这个问题产生了多个好的答案。 【参考方案1】:毫秒以日期时间格式仅以大约 1/300 秒的精度存储,这就是不准确的来源。
你可以查看这个答案:Why is SQL Server losing a millisecond?
要获得更高的精度(100 纳秒),您可以使用 SQL Server 2008 中引入的DATETIME2
。您可以在此处获取更多信息:
【讨论】:
【参考方案2】:您可能正在使用 SQL Server 类型 DATETIME
,文档指出:
Rounded to increments of .000, .003, or .007 seconds.
如果您希望与 .NET DateTime
完全兼容,则应使用 DATETIME2
类型。两者都具有 100 纳秒的精度。
不再使用DATETIME
的理由不多。 DATETIME2(7)
占用 8 个字节,与 DATETIME
相同,但精度和范围要大得多。 DATETIME2(3)
占用 6 个字节并且仍然具有更好的精度(3 个小数,没有上面详述的奇怪的舍入行为)。
【讨论】:
【参考方案3】:一切都与精度有关。如果您在数据库中使用 datetime 类型,请尝试使用 datetime2 类型。
【讨论】:
【参考方案4】:您应该检查表的结构。在create table
部分,应该是这样的:
CREATE TABLE t1 (dt DATETIME(6) NOT NULL);
按原样获取Output。
【讨论】:
【参考方案5】:很清楚这不是.NET
或代码问题
DECLARE @TestDateFrom DATETIME='2010-06-29 05:04:56.599'
SELECT @TestDateFrom
结果
2010-06-29 05:04:56.600
并且对 Szymon 的回答感到满意“毫秒以日期时间格式仅以大约 1/300 秒的精度存储,因此这就是不准确的原因。”
【讨论】:
以上是关于Sql Server 中的 DateTime 插入更改值的主要内容,如果未能解决你的问题,请参考以下文章
sql server数据库中定义了datetime数据类型,在插入数据时输入格式是“2001-9-1”可以,是“9/1/2001”
如何将当前日期和时间插入到具有 DateTime 类型列的 SQL Server 表中?
在为 Date SQL Server 字段添加 DateTime C# 值时,我应该使用 Date 还是 DateTime SqlDbType?