7

当我插入这些值

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();
4

5 回答 5

6

毫秒以日期时间格式仅以大约 1/300 秒的精度存储,因此这就是不准确性的来源。

您可以查看这个答案:为什么 SQL Server 会丢失一毫秒?

要获得更高的精度(100 纳秒),您可以使用DATETIME2SQL Server 2008 中引入的。您可以在此处获取更多信息:

于 2013-10-01T11:50:11.543 回答
5

您可能正在使用 SQL Server type DATETIME,文档指出:

Rounded to increments of .000, .003, or .007 seconds.

DATETIME2如果您希望与 .NET 完全兼容,则应使用该类型DateTime。两者都具有 100 纳秒的精度。

没有太多好的理由再使用DATETIME了。ADATETIME2(7)占用 8 个字节,与 a 相同DATETIME,但精度和范围要大得多。ADATETIME2(3)占用 6 个字节并且仍然具有更好的精度(3 个小数,没有上面详述的奇怪的舍入行为)。

于 2013-10-01T11:49:43.730 回答
1

一切都与精度有关。如果您在数据库中使用 datetime 类型,请尝试 datetime2 类型。

于 2013-10-01T11:48:57.600 回答
0

您应该检查表的结构。在create table部分中,它应该是这样的:

CREATE TABLE t1 (dt DATETIME(6) NOT NULL);

按原样获取输出。

于 2013-10-01T11:48:56.660 回答
0

很清楚这不是.NET代码问题

DECLARE @TestDateFrom  DATETIME='2010-06-29 05:04:56.599'
SELECT @TestDateFrom 

结果

2010-06-29 05:04:56.600

并且对 Szymon 的回答感到满意:“毫秒仅以大约 1/300 秒的精度以日期时间格式存储,因此这就是不准确性的来源。”

于 2013-10-01T12:00:27.760 回答