2009-03-11 9 views
11

Ho riscontrato un problema relativo alla conversione dei dati di data da XML (ISO8601: aaaa-mm-ggThh: mi: ss.mmm) a SQL Server 2005 datetime. Il problema è quando la conversione dei millisecondi è sbagliata. Ho provato sia la conversione implicita ed esplicita mediante la conversione (datetime, MyDate, 126) da nvarchar, e il risultato è lo stesso:Errore di millisecondi durante la conversione da XML a SQL Server datetime

Original    Result 
2009-10-29T15:43:12.990 2009-10-29 15:43:12.990 
2009-10-29T15:43:12.991 2009-10-29 15:43:12.990 
2009-10-29T15:43:12.992 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.993 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.994 2009-10-29 15:43:12.993 
2009-10-29T15:43:12.995 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.996 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.997 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.998 2009-10-29 15:43:12.997 
2009-10-29T15:43:12.999 2009-10-29 15:43:13.000 

mio test non estesa mostra che l'ultima cifra è 0, 3 o 7. Si tratta di un semplice problema di arrotondamento? La precisione millisecondo è importante e perdere/guadagnare uno o due non è un'opzione.

risposta

17

Sì, SQL Server giri volta in 3.(3) millisecondi:

SELECT CAST(CAST('2009-01-01 00:00:00.000' AS DATETIME) AS BINARY(8)) 
SELECT CAST(CAST('2009-01-01 00:00:01.000' AS DATETIME) AS BINARY(8)) 

0x00009B8400000000 
0x00009B840000012C 

Come si può vedere, questi DATETIME 's differiscono di 1 secondo, e le loro rappresentazioni binarie differiscono di 0x12C, cioè 300 in decimale.

Questo perché SQL Server memorizza il time parte del DATETIME come un certo numero di secondi 1/300 zecche dalla mezzanotte.

Se si desidera una maggiore precisione, è necessario memorizzare una parte TIME come valore separato. Ad esempio, il tempo di archiviazione arrotondato al secondo come DATETIME e millisecondi o qualsiasi altra precisione necessaria come INTEGER in un'altra colonna.

Questo vi permetterà di utilizzare complessi DATETIME aritmetica, come l'aggiunta di mesi o di trovare i giorni della settimana su DATETIME 's, e si può solo aggiungere o sottrarre i millisecondi e concatenare il risultato come .XXXXXX+HH:MM per ottenere validi XML rappresentazione.

+0

Qual è la soluzione allora? –

+0

Direi, non utilizzare il datatyp DateTime di SQL Server. Memorizza invece il valore in un VARCHAR. –

+1

Grazie, questo è stato illuminante, anche se un po 'deprimente. – chriscena

6

A causa della precision issues mentioned by Quassnoi se avete la possibilità di utilizzare l'uso SqlServer 2008 si può considerare l'utilizzo di datetime2 datatype o se si è solo preoccupato per la parte di tempo è possibile utilizzare time datatype

Date and Time Data Types - elenca tutti i tipi e la loro precisione

In Sql Server 2005 se avevo bisogno di precisione di 1 millisecondo, aggiungerei una colonna in più millisecondo di tipo int per memorizzare il numero di millisecondi e rimuovere la parte dei millisecondi dalla colonna dateTime (impostarla su 000). Questo supponendo che tu abbia bisogno anche delle informazioni sulla data.

+0

Abbiamo eseguito test con SQL Server 2008, ma il client è ancora nel 2005. Gli aggiornamenti sono stati suggeriti. – chriscena

Problemi correlati