2009-04-03 15 views
55

Tengo una tabla estructurada de esta manera:¿Por qué SQL Server pierde un milisegundo?

CREATE TABLE [TESTTABLE] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [DateField] [datetime] NULL, 
    [StringField] [varchar](50), 
    [IntField] [int] NULL, 
    [BitField] [bit] NULL 
) 

ejecuto el siguiente código:

BEGIN 
    INSERT INTO TESTTABLE (IntField, BitField, StringField, DateField) 
    VALUES ('1', 1, 'hello', {ts '2009-04-03 15:41:27.378'}); 

    SELECT SCOPE_IDENTITY() 
END 

Y luego

select * from testtable with (NOLOCK) 

y mi resultado muestra:

2009-04-03 15:41:27.*377* 

para la columna DateField.

¿Alguna idea de por qué parece que estoy perdiendo un milisegundo?

+0

Noté mismo error con fechas como '2008-12-31 23: 59: 59.999' –

+1

vistazo a esto: SELECT CONVERT (DATETIME, '2008-12-31 23: 59: 59.999 ') –

+0

[Ver esta pregunta] (http://stackoverflow.com/questions/634122) para más detalles –

Respuesta

77

SQL Server solo almacena el tiempo en aproximadamente 1/300th de un segundo. Estos siempre caen en los 0, 3 y 7 milisegundos. P.ej. contando desde 0 en el incremento más pequeño:

00: 00: 00.000
00: 00: 00,003
00: 00: 00,007
00: 00: 00,010
00: 00: 00,013
..

Si necesita una precisión de milisegundos, no hay una forma agradable de evitarlo. Las mejores opciones que he visto son almacenar el valor en campos numéricos personalizados y reconstruirlo cada vez que recupera el valor, o almacenarlo como una cadena de un formato conocido. Luego puede (opcionalmente) almacenar una fecha "aproximada" en el tipo de fecha nativa por el bien de la velocidad, pero introduce una complejidad conceptual que a menudo no se desea.

+11

Asegúrese de leer la publicación de Rob Garrison sobre TIME y DATETIME2 - estos tipos tienen una resolución mucho mayor. –

5

SQL Server tiene una precisión de hasta 1/300 de segundo. Redondeará los valores al 1/300 más cercano.

+0

Gracias por las respuestas. Me hace sentir mejor. Solo tengo que ajustar mis pruebas de unidad. :) – sproketboy

+1

Cerrar, la resolución de 3/1000 sería 000, 003, 006, 009 ... 1/300 de resolución es 000, 003, 007, 010 ... – Eclipse

2

que he oído, pero no puede encontrar una referencia oficial, que SQL Server almacena los valores de fecha y hora con una precisión de 3 milisegundos.

3

DATETIME no tiene precisión infinita; probablemente esté utilizando un valor que no se puede representar con precisión con los bits disponibles.

Cuestiones relacionadas