Me encuentro con un error extraño usando campos de fecha y hora en SQL Server 2005. El campo de fecha y hora aparece con precisión de milisegundos, pero parece que los milisegundos no son siempre usado. Aquí está mi consulta de prueba:Consultar campos de fecha y hora con milisegundos da un resultado erróneo en SQL Server
SELECT col1, YEAR(col1) AS yr, MONTH(col1) AS mn, DAY(col1) AS dy
FROM mytable
WHERE col1 >= '2009-12-31 00:00:00.0' AND col1 <= '2009-12-31 23:59:59.999'
ORDER BY col1
En mis resultados me sale:
col1 | yr | mn | dy ----------------------------+------+----+---- 2009-12-31 00:00:00:00.000 | 2009 | 12 | 31 2010-01-01 00:00:00:00.000 | 2010 | 1 | 1
El problema es que tengo la fecha 2010-01-01, a pesar de que no debe ser menor o igual a "2009-12-31 23: 59: 59.999". Pero si cambio la consulta para usar "2009-12-31 23: 59: 59.99 " funciona bien (no se devuelven las fechas de 2010).
¿Es esto un error, o es así como funciona SQL Server? Si así es como funciona, ¿hay alguna razón para ello? Me encontré con esto migrando algunas consultas de MySQL, donde funciona como se esperaba (¡aunque MySQL ni siquiera almacena los milisegundos!).
Si se trata de una opción en su código, el uso menor que: "... AND col1 <'2010-1-1 00: 00: 00.0' –
Solo para agregar la referencia: http://msdn.microsoft.com/en-us/library/ms187819.aspx 'Exactitud: redondeado a incrementos de .000, .003 o .007 segundos' –
tics de 3.33 milisegundos. Me pregunto por qué en la tierra eligieron eso? Si lo están almacenando como una fecha de 32 bits y un tiempo de 32 bits, el número total de milisegundos en un día es solo 0x05265c00, que se ajusta en un entero de 32 bits con espacio libre. – Jenni