2009-09-22 10 views
8

Ho delle date di alta precisione memorizzate in un server SQL, ad es.Nessun valore in millisecondi durante la lettura dei valori DateTime da un database SQL in C#

2009-09-15 19:43:43.910 

Tuttavia quando si converte tale valore in un DateTime il valore millisecondi del valore DateTime risultante è 0:

reader["Timestamp"] = 15/09/2009 19:43:43.000 

Avendo questi valori DateTime in precisione fino a millisecondi è molto importante per me - cosa è il modo migliore per farlo?

UPDATE: Questo è il codice che esegue la conversione:

DateTime myDate = (DateTime)reader[Timestamp"]; 

Non c'è niente di speciale la dichiarazione SELECT, infatti si tratta di un SELECT * - senza fantasia getta o niente

E ' sembra che l'oggetto DateTime restituito dallo SqlDataReader semplicemente non sia popolato con il valore Millisecond

+3

Come stai eseguendo la conversione? Si prega di mostrare il codice. –

+0

In base all'importanza di tale valore, potrebbe essere necessario un meccanismo di archiviazione diverso. La parte 10^-3 è arrotondata. –

+0

Hmm, ora lo vedo, ma con il più vicino 003, 005 o 007 è ancora molto più alto del più vicino grado di precisione che vedo nel mio C# DateTime (cioè 1.000) – Justin

risposta

-2

Ecco come mi piacerebbe provare per risolvere questo problema:

  1. passare nel debugger e osservare il tipo e il valore del lettore [Timestamp "]. Se il tipo non è SqlDateTime, ciò mi renderebbe sospetto - quindi esaminerei la query per capire perché quella colonna restituiva un altro tipo anziché DATETIME (o DATETIME2, ecc.)

  2. se tale valore è SqlDateTime e contiene millisecondi, quindi guarderei il cast come fonte del problema. Per convalidare questo, proverei (nel debugger o nel codice) SqlDataReader.GetDateTime() e SqlDataReader.GetSqlDateTime() per vedere se o restituisce il risultato corretto. Questo sembra davvero improbabile come fonte del problema: il casting dovrebbe funzionare bene.

  3. se quel valore da # 1 è SqlDateTime ma non contiene millisecondi, quindi guarderei a un problema upstream nel database-- in altre parole la query restituisce qualcosa senza millisecondi. quando esegui esattamente la stessa query in Management Studio, vedi millisecondi?

La mia ipotesi è che si tratta di un problema relativo alla query. Ma sono incuriosito di trovare di più.

+0

Il tipo di lettore ["Timestamp"] è System.DateTime - il tentativo di eseguire il cast in un SqlDateTime ha esito negativo. – Justin

+0

La query è un semplice "SELECT * FROM ..." - il ... è in questo caso molto complesso, tuttavia ho eseguito esattamente la stessa query in Sql Server Management Studio e vedo quindi il valore di Milliseconds. – Justin

+0

Cosa ottieni quando usi reader.GetSqlDateTime()? Inoltre, un'altra possibilità potrebbe essere (se il tuo "..." è un join) che ci sono due coulle da tabelle diverse con lo stesso nome ma con valori diversi. È facile da testare sostituendo * con un nome di coulumn nella tua query. –

5

Questo perché la stringa di formato predefinita per DateTime non include i millisecondi.

Se si utilizza un formato personalizzato , verrà visualizzato il valore in millisecondi.

Un esempio:

public class Program 
    { 
    private static string connString = @"Data Source=(local);Initial Catalog=DBTest;Integrated Security=SSPI;"; 
    public static void Main(string[] args) 
    { 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
     conn.Open(); 

     using (SqlCommand cmd = new SqlCommand("SELECT * FROM MilliSeconds")) 
     { 
      cmd.Connection = conn; 

      SqlDataReader reader = cmd.ExecuteReader(); 
      while(reader.Read()) 
      { 
      DateTime dt = (DateTime)reader["TimeCollected"]; 
      int milliSeconds = dt.Millisecond; 
      Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss.fff")); 
      } 
     } 
     } 

     Console.ReadLine(); 
    } 
    } 

da un database con questi valori:

1 2009-09-22 18:11:12.057 
2 2009-09-22 18:11:28.587 
3 2009-09-22 18:11:29.820 

L'output risultante dal codice sopra è:

2009-09-22 18:11:12.057 
2009-09-22 18:11:28.587 
2009-09-22 18:11:29.820 
+1

Spiacente, non è che Timestamp.ToString ("aaaa-MM-gg HH: mm: ss.fff") restituisce 19: 43: 43.000 - nota che i valori del millisecondo sono tutti 0 quando sono 910 nel database. – Justin

+1

Beh, non sono d'accordo con te. Ho aggiunto l'output risultante dal mio codice di esempio. –

14

Ho avuto questo stesso problema e dopo un po 'la lettura si scopre che quando si recuperano la data come si stava facendo

DateTime myDate = (DateTime)reader["Timestamp"]; 

lo SQLDataReader scende i millisecondi. Tuttavia, se si utilizza il metodo getDateTime del SQLDataReader restituisce un oggetto DateTime che conserva i millisecondi:

reader.GetDateTime(reader.GetOrdinal("Timestamp")); 
0

Ho avuto lo stesso problema e ho risolto persistendo il C# DateTime come SQL bigint popolata con DateTime.Ticks. Ciò conserva la precisione completa di DateTime. E, naturalmente, può essere de-serializzato con il costruttore DateTime (tick lunghi).

Problemi correlati