sql >> Base de Datos >  >> RDS >> Sqlserver

La consulta en los campos de fecha y hora con milisegundos da un resultado incorrecto en SQL Server

SQL Server almacena parte de tiempo como número de 1/300 Segundo largo ticks desde la medianoche.

23:59:59.999 se redondea al tick más cercano que resulta ser 00:00:00.000 del día siguiente.

SELECT  CAST(CAST('2009-12-01 00:00:00.000' AS DATETIME) AS BINARY(8)),
        CAST(CAST('2009-12-01 23:59:59.997' AS DATETIME) AS BINARY(8)),
        CAST(CAST('2009-12-01 23:59:59.999' AS DATETIME) AS BINARY(8))



0x00009B8F 00000000    0x00009B8F 018B81FF    0x00009B90 00000000

En el primer valor, la parte de la fecha, 0x9B8F (39823 ) es el número de días desde el Jan 1st, 1900 , y la parte de tiempo, 0 , es el número de tics desde la medianoche.

En el segundo valor, 0x018B81FF (25919999 , o 24 * 60 * 60 * 300 - 1 ) es el número máximo posible de ticks desde la medianoche.

Finalmente, el tercer valor tiene el 0 en la parte de la hora y la parte de la fecha aumentada en uno.