2011-10-19 9 views
29

Ho un momento la data che ho generato in questo modo:millisecondi miei cambiamenti DateTime quando memorizzati in SQL Server

DateTime myDateTime = DateTime.Now; 

ho poi conservarlo nel database (in una colonna digitato DateTime) con Entity Framework. Quindi lo recupero con OData (WCF Data Services).

Quando va nel valore timeofday è: 09: 30: 03,0196095

Quando si esce il valore timeofday è: 09: 30: 03,0200000

L'effetto netto di questo rende in modo che i Millisecondi siano visti come 19 prima che vengano salvati e 20 dopo essere stati ricaricati.

Così quando faccio un confronto più avanti nel mio codice, fallisce dove dovrebbe essere uguale.

SQL Server non ha la stessa precisione di .NET? O è Entity Framework o OData che sta incasinando questo?

Appena troncato fuori dai millisecondi (non ne ho davvero bisogno). Ma mi piacerebbe sapere perché questo sta accadendo.

+0

come stai facendo il confronto? – ChrisBint

+1

È una precisione diversa. Vedi le domande correlate a lato. –

+1

In quale versione di SQL Server ci si trova? Se il 2008 'datetime2' ha maggiore precisione. –

risposta

37

Questo dipende molto dalla versione del server SQL che si sta utilizzando.

La risoluzione del campo data ora è al 3 cifre decimali: ad esempio: 2011-06-06 23:59:59.997 ed è solo accurato entro 3.33 ms.

Nel tuo caso, 09: 30: 03.0196095 è essere arrotondato a 09: 30: 03.020 su storage.

A partire da SQL 2008, sono stati aggiunti altri tipi di dati per fornire maggiori dettagli, ad esempio datetime2 con fino a 7 posizioni decimali e con una precisione di 100ns.

vedere il seguente per ulteriori informazioni: http://www.karaszi.com/SQLServer/info_datetime.asp

penso che la cosa migliore è quello di fornire l'arrotondamento al secondo prima di conservarla in SQL Server se i millisecondi non è importante.

3

La precisione di DateTime in SQL Server è millisecondi (.fff). Quindi 0,0196 arriverebbe a 0,020. Se è possibile utilizzare datetime2, si ottiene una maggiore precisione.

+0

Alas, DateTime2 non è supportato in OData. Quindi non posso usarlo. – Vaccano

17

Ciò è dovuto alla precisione del tipo SQL datetime. Secondo MSDN:

valori datetime vengono arrotondati a incrementi di .000, .003, .007 o secondi

sguardo al Arrotondamento di datetime frazionale Seconda precisione sezione del this msdn page e si' Capiremo come è fatto l'arrotondamento.

Come indicato da altri, è possibile utilizzare datetime2 invece di datetime di avere una maggiore precisione:

  • datetime intervallo di tempo è 00:00:00 through 23:59:59.997
  • datetime2 intervallo di tempo è 00:00:00 through 23:59:59.9999999
+0

datetime2 arrotonda ancora i decimali al millisecondo allo stesso modo per me. perché?? – RobPio

2

Per coloro che non ho la possibilità di utilizzare DateTime2 in SQL (ad es. come me che utilizzo tabelle generate da un sistema separato che sarebbe costoso e per cambiare per questo singolo numero), c'è una semplice modifica del codice che farà l'arrotondamento per te.

Riferimento System.Data e importare lo spazio dei nomi System.Data.SqlTypes. È quindi possibile utilizzare la struttura SqlDateTime per eseguire la conversione per voi:

DateTime someDate = new SqlDateTime(DateTime.Now).Value; 

Questo convertirà il valore in SQL zecche, e poi di nuovo in .NET zecche, tra cui la perdita di precisione. :)

Una parola di avviso, questo perderà il Kind della struttura originale DateTime (ad esempio Utc, Local). Questa conversione non è semplicemente un arrotondamento, c'è una conversione completa che include calcoli tick, variazioni MaxTime, ecc. Quindi non usare questo se si fa affidamento su specifici indicatori in DateTime in quanto potrebbero essere persi.

Problemi correlati