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

Convierta los campos de fecha y hora del servidor SQL para comparar solo partes de fechas, con búsquedas indexadas

La mejor manera de eliminar la parte de la hora de un campo de fecha y hora es usar las funciones de fecha y hora.

   DateAdd(day, datediff(day,0, MydateValue), 0)

Esto aprovecha el hecho de que SQL Server almacena las fechas como dos números enteros, uno que representa el número de días desde el día "0" (1 de enero de 1900) y el segundo que representa el número de ticks (cada tic es de unos 3,33 ms) desde la medianoche (para la hora) *.

la fórmula anterior simplemente tiene que leer solo el primer entero. No se requiere conversión ni procesamiento, por lo que es extremadamente rápido.

Para hacer que sus consultas usen un índice... use esta fórmula en los parámetros de filtrado de entrada primero, o en el "otro" lado del signo igual del campo de fecha y hora de las tablas, para que el optimizador de consultas no tenga que ejecutar el cálculo en cada campo de fecha y hora de la tabla para determinar qué filas satisfacen el predicado del filtro. Esto hace que su argumento de búsqueda sea "SARG-able" (Argumento de búsqueda)

Where MyDateTimeColumn > DateAdd(day, 
      datediff(day,0, @MydateParameter), 0)    -- SARG-able

en lugar de

Where DateAdd(day, datediff(day,0, 
      MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able

* NOTA. Internamente, el segundo entero (la parte del tiempo) almacena los ticks. En un día hay 24 x 60 X 60 X 300 =25 920 000 tics (afortunadamente justo por debajo del valor máximo que puede contener un entero de 32 bits). Sin embargo, no necesita preocuparse por esto cuando modifica aritméticamente una fecha y hora... Al sumar o restar valores de fechas y horas, puede tratar el valor como una fracción como si fuera exactamente igual a la parte fraccionaria de un día, como si la el valor completo de fecha y hora era un número de punto flotante que constaba de una parte entera que representaba la fecha y la parte fraccionaria que representaba la hora). es decir,

`Declare @Dt DateTime  Set @Dt = getdate()  
 Set @Dt = @Dt + 1.0/24  -- Adds one hour  
 Select @Dt  
 Set @Dt = @Dt - .25 -- Moves back 6 hours  
 Select @Dt`