2013-10-01 27 views
7

Kiedy wstawić te wartościDateTime włożona wartość zmienia SQLSERVER

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 

w bazie SQLSERVER zmienia wartość milisekundy w dziwny sposób

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 

Co się stało?

Edit: odpowiedni kod:

 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(); 
+2

dobre pytanie +1, czy możesz opublikować kod skąd wysyłasz go do db? – vikas

+0

Użyj datetime2, jeśli korzystasz z serwera sql 2008 lub plus Sprawdź również http://stackoverflow.com/questions/7823966/milliseconds-in-my-datetime-changes-when-stored-in-sql-server –

+0

+1 ponieważ to pytanie generowało wiele dobrych odpowiedzi. –

Odpowiedz

6

Milisekundy są przechowywane z dokładnością około 1/300 sekundy w formacie datetime, stąd pochodzi niedokładność.

Można to sprawdzić odpowiedź: Why is SQL Server losing a millisecond?

Aby uzyskać większą precyzję (100 nanosekund), można użyć DATETIME2 który został wprowadzony w SQL Server 2008. Można uzyskać więcej informacji tutaj:

0

Należy sprawdzić strukturę tabeli jest. W create table części, powinno być tak:

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

Aby uzyskać Output jak to jest.

1

To wszystko na temat precyzji. Jeśli korzystasz z typu datetime w bazie danych, wypróbuj typ datetime2.

5

Prawdopodobnie używasz typu SQL Server DATETIME, której dokumentacja stwierdza:

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

Typ DATETIME2 powinny być stosowane, jeżeli chcesz pełną kompatybilność z .NET DateTime. Obie mają dokładność 100 nanosekund.

Nie ma wielu dobrych powodów, aby już teraz używać DATETIME. A DATETIME2(7) zajmuje 8 bajtów, które są takie same jak DATETIME, ale ma znacznie większą dokładność i zasięg. A DATETIME2(3) zajmuje 6 bajtów i nadal ma lepszą dokładność (3 miejsca dziesiętne bez dziwnego zachowania zaokrąglania opisanego powyżej).

0

całkiem jasne, że to nie jest .NET lub problem kod

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

Wynik

2010-06-29 05: 04: 56,600

i zadowoleni z Szymonem odpowiedź „milisekund są przechowywane tylko z dokładnością do około 1/300-ci sekundy w formacie datetime, stąd pochodzi niedokładność. "

Powiązane problemy