Tengo una fecha en el tiempo que yo genero como este:

DateTime myDateTime = DateTime.Now;

Yo luego guardarlo en la base de datos (en un DateTime escribió la columna) con Entity Framework. Yo luego recuperarlo con OData (Servicios de Datos de WCF).

Cuando se va en la TimeOfDay valor es: 09:30:03.0196095

Cuando sale el TimeOfDay valor es: 09:30:03.0200000

El efecto neto de esto se hace para que el Milisegundos son vistos como 19 antes de que se guarden y 20 después de que se vuelva a cargar.

Así que cuando tengo que hacer una comparación más tarde, en mi código, no donde debe ser igual.

Hace que SQL Server no tiene tanta precisión como .NETA? O es que Entity Framework o OData que está arruinando esto?

Me limitaré a truncar fuera de la milisegundos (realmente no los necesita). Pero me gustaría saber por qué está pasando esto.

  • cómo estás haciendo la comparación?
  • Es una forma diferente de precisión. Ver las preguntas relacionadas al lado.
  • ¿Qué versión de SQL Server está usted? Si de 2008 datetime2 tiene mayor precisión.
  • Sólo truncar fuera de la ms podría no ser suficiente. Usted podría tener 09:30:03.999999 redondeado a 09:30:04.000000
  • Voy a sacar de la milisegundos antes de guardarlo en la base de la primera vez. Así que la segunda vez que coincidir.
  • el truncamiento es más común que la de redondeo cuando se trata con los tiempos – en particular, todo el estándar de formato DateTime cadenas de truncar cuando se muestran con menor que la máxima (100 ns) precisión. Así, 09:30:03.99999 se convierte 09:30:03, de la misma manera que 01/01/2011 a las 23:59 se convierte en 01/01/2011.
  • la forma en que Vaccano dice que él va a hacer lo que debería estar bien. Yo estaba preocupado por lo SQL haría con un no-valor truncado, pero él está tomando el cuidado de eso.
  • En el momento que yo propagar una .net DateTime fuera de mi programa local, supongo que es sólo una precisión de unos pocos cientos de milisegundos. Mi razonamiento es que la hora UTC cuentas para los segundos intercalares y .net DateTime no. Normalmente voy a utilizar un smalldatetime en mi base de datos y a la vuelta de mi datetime al minuto más cercano antes de enviarlo a la base de datos. Para datetime punto medio de redondeo, check out -> stackoverflow.com/questions/1393696/rounding-datetime-objects

InformationsquelleAutor Vaccano | 2011-10-19

4 Comentarios

  1. 44

    Esto realmente depende de la versión de SQL server que está utilizando.

    La resolución de la fecha campo hora es de hasta 3 decimales: Por ejemplo: 2011-06-06 23:59:59.997 y es sólo accuracte dentro de 3.33 ms.

    En su caso, 09:30:03.0196095 se redondea a 09:30:03.020 en el almacenamiento.

    A partir de SQL 2008, otros tipos de datos se han añadido para proporcionar más detalles, como datetime2 que tiene hasta 7 cifras decimales y tiene una precisión de 100 ns.

    Ver los siguientes enlaces para más información:

    http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

    Creo que su mejor apuesta es ofrecer el redondeo al segundo ANTES de guardarla en SQL server si el milisegundos es importante.

  2. 20

    Esto es debido a la precisión de la SQL datetime tipo. De acuerdo a msdn:

    Datetime valores se redondean a incrementos de .000, .003, o .007 segundos

    Vistazo a la Redondeo de datetime Precisión de fracciones de Segundo sección de esta página de msdn y vas a entender cómo el redondeo se realiza.

    Como se indica por los demás, puede utilizar datetime2 en lugar de datetime para tener una mejor precisión:

    • datetime intervalo de tiempo se 00:00:00 through 23:59:59.997
    • datetime2 intervalo de tiempo se 00:00:00 through 23:59:59.9999999
    • datetime2 todavía rondas milisegundo decimales de la misma manera para mí. por qué??
  3. 4

    Para aquellos que no tienen la capacidad para utilizar DateTime2 en SQL (ex: me gusta el uso de las tablas que se generan por un sistema distinto que sería muy costoso el cambio de un solo tema), no es una simple modificación del código que va a hacer el redondeo para usted.

    Referencia System.Data de importación y el System.Data.SqlTypes espacio de nombres. Usted puede utilizar el SqlDateTime estructura para hacer la conversión para usted:

    DateTime someDate = new SqlDateTime(DateTime.Now).Value;

    Esto convertirá el valor en SQL las garrapatas y, a continuación, de nuevo en .NETO de las garrapatas, incluyendo la pérdida de precisión. 🙂

    Una palabra de advertencia, este perderá el Kind de la original DateTime estructura (es decir,Utc, Local). Esta conversión no es simplemente redondeo, hay una conversión completa, incluyendo la garrapata cálculos, MaxTime cambios, etc.. Así que no use esta opción si usted está confiando en los indicadores específicos en DateTime como podrían ser perdido.

  4. 3

    La precisión de DateTime en SQL Server es milisegundos (.fff). Así 0.0196 podría redondear a 0.020. Si usted puede utilizar datetime2, se obtiene una mayor precisión.

    • Por desgracia, DateTime2 no es compatible con OData. Así que no se puede usar.

Dejar respuesta

Please enter your comment!
Please enter your name here