2012-04-12 11 views
8

Ho un metodo che ottiene una proprietà data da una sorgente (o un DataRow o un SqlDataReader):Conversione da DateTime SqlDateTime è imprecisa

protected SqlDateTime GetSqlDateTimePropertyValue(string propertyName, object source) 
{ 
    var objValue = GetPropertyValue(propertyName, source); 
    var value = objValue == DBNull.Value ? null : (DateTime?)objValue; 
    var sqlValue = new SqlDateTime(); 
    if (value.HasValue) sqlValue = value.Value; 
    return sqlValue; 
} 

ma la conversione sembra cambiare la data leggermente in modo che il mio test fallisce sempre.

Qualcuno sa perché questo metodo si converta in modo errato?

Alla fine del metodo, sembra che la conversione a SqlDateTime fa qualche arrotondamento:

value.Value.Ticks:  634698391707468296 
sqlValue.Value.Ticks:  634698391707470000 
+0

Vedi: http://stackoverflow.com/questions/7824766/how-does-sqldatetime-do-its-precision-reduction –

risposta

9

Sì - SQL Server DATETIME ha una precisione di 3.33ms - il tipo di dati .NET tuttavia può rappresentare singolo millisecondi.

Pertanto, a volte si verificano problemi di arrotondamento.

saperne molto di più sul DATETIME tipo di dati e le sue proprietà e le stranezze qui:

Demystifying the SQL Server DATETIME datatype

Inoltre, SQL Server 2008 ha introdotto una serie di nuovi tipi di dati correlate alla data - saperne di più quelli che sono qui:

SQL Server 2008 New DATETIME datatypes

Questi tipi fanno includere un tipo di dati DATETIME2, che ha una precisione di 100 ns.

+1

Wow, risposta rapida ed eccellente! Grazie! –

3

Questa è la precisione documentata della data e ora di TSQL. Vedere la sezione "Arrotondamento della seconda precisione frazionale datetime" allo this link from MSDN. Citazione dalla sezione:

valori datetime vengono arrotondati a incrementi di .000, .003, .007 o secondi, come mostrato nella tabella seguente.

Data-ora .NET ha una precisione migliore.

Inoltre, MS consiglia di utilizzare tipi di dati più recenti (come datetime2, data, ora ecc.) Anziché data-ora. Il tipo di dati datetime2 introdotto con Sql Server 2008 ha una precisione simile (100ns) (come la struttura di data/ora .NET) e supporta anche il formato di stringa ISO 8601 che renderebbe più semplice la conversione da data/ora .NET a SQL date-time ((vale a dire quando si è costretti ad utilizzare letterali invece di interrogazione parametrizzata) e senza perdite.

+0

Grazie vinayc! Penso che marc_s ti abbia beccato al post Ottima risposta anche se +1, e grazie –

0

l'oggetto SqlDateTime ha meno precisione rispetto all'oggetto .NET DateTime, e così durante la conversione in SQL perderà un po 'di precisione.

Problemi correlati