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。您可以在此处获取更多信息:

http://msdn.microsoft.com/en-us/library/bb677335.aspx http://www.mssqltips.com/sqlservertip/1616/sql-server-2008-date-and-time-data-types/

【讨论】:

【参考方案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?

SQL Server:将日期时间插入表中

SQL Server CE 中的正确日期时间格式?

c# 中的 DateTime 和 SQL server 中的 DateTime 有啥区别吗?