2011-05-25 18 views
22

Cuando almaceno la propiedad date con el valor DateTime.MaxValue en la base de datos y la recupero, el valor almacenado no es igual a DateTime.MaxValue. Las propiedades de tictac están desactivadas. ¿Por qué es esto?.net DateTime MaxValue es diferente una vez que se almacena en la base de datos

El uso de MS SQL, tipo de datos de campo de fecha es 'fecha y hora'

enter image description here

+0

¿Qué base de datos está utilizando y qué tipo de datos está almacenando en la base de datos? – David

+0

Pregunta muy interesante @ dev.e.loper –

+0

¿Has probado datetime2? http://technet.microsoft.com/en-us/library/bb677335.aspx –

Respuesta

20

Porque la hora de fecha de SQL tiene una resolución más baja.

El tipo de datos DateTime en MS SQL representa los datos de fecha y hora de 1 de enero de, 1753, y el 31 de diciembre de 9999, con una precisión de un segundo tres centésima, o 3.33 milisegundos. Los valores se redondean a incrementos de .000, .003 o .007 milisegundos.

source

El tipo de valor DateTime en .Net representa fechas y horas de 12:00:00 medianoche, 1 de enero de 0001 Anno Domini (Common Era) a través de 11:59 : 59 PM, 31 de diciembre de 9999 AD (CE) Los valores de tiempo se miden en Unidades de 100 nanosegundos denominadas tics.

source

+0

FWIW - Me dijeron que esto se solucionará en SQL Server 2010 (o lo que sea que lo lanzarán) para que coincidan los tipos de datos de DateTime. – dolphy

+1

@dolphy, hasta cierto punto ya lo han "arreglado" en SQL 2008 - tiene nuevos tipos de datos de fecha y hora que permitirán más (o menos) precisión. Dudo mucho que MS cambie alguna vez el funcionamiento de los "viejos" tipos de datos de fecha y hora, ya que eso rompería una gran cantidad de código existente y haría enojar a gran parte de su base de clientes existente. –

+0

@Philip Kelley - eso es exactamente a lo que me refería. No me di cuenta de que había hecho esto en SQL 2008. Supongo que eso muestra que mi compañía todavía está en SQL 2005 :-) – dolphy

1

Debo admitir que no estoy seguro de esto, pero podría ser que ver con la exactitud de la fecha y hora?

Haciendo una búsqueda rápida aquí es un artículo sobre el Precision and accuracy of DateTime

también quizá hay un mistmatch entre la precisión de la fecha y hora en C# y SQL?

0

¿De qué tipo es el campo de datos en el que está almacenando este valor?

Podría ser que el valor máximo para .NET DateTime exceda la capacidad para el tipo de datos equivalente en el motor de la base de datos.

2

Podría ser porque un .NET DateTime no se traduce directamente al tipo SQL DateTime.

Yo establecería el valor y luego verificaría los ticks contra SqlDateTime.MaxValue.

0

MS SQL Server hace algunas cosas extrañas con las fechas en el nivel más bajo. Por ejemplo, consideremos el siguiente script:

select 
    test1 = dateadd(ms,-1,convert(datetime,'20110504')), 
    test2 = dateadd(ms,-2,convert(datetime,'20110504')), 
    test3 = dateadd(ms,-3,convert(datetime,'20110504')), 
    test4 = dateadd(ms,-4,convert(datetime,'20110504')), 
    test5 = dateadd(ms,-5,convert(datetime,'20110504')), 
    test6 = dateadd(ms,-6,convert(datetime,'20110504')) 

Esto devuelve:

test1     test2     test3     test4     test5     test6 
----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- 
2011-05-04 00:00:00.000 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.993 2011-05-03 23:59:59.993 

Como se puede ver MS SQL sólo se está ocupando de milisegundos a la más cercana 3. Si vas entre éstos consiguen redondeados. Es posible que esto sea lo que sucede cuando DateTime.MaxValue se está almacenando en SQL.

Cuestiones relacionadas