A melhor maneira de retirar a parte de tempo de um campo de data e hora é usando datediff e funções DATEADD.
DateAdd(day, datediff(day,0, MydateValue), 0)
Isso leva AdvantEdge do fato de que o SQL Server armazena data como dois inteiros, um representando o número de dias desde o primeiro dia "0" - (1 jan 1900), ea segunda, que representa o número de carrapatos (cada um carrapato é de cerca de 3,33 ms ) desde meia-noite (para a época) *.
a fórmula acima simplesmente tem que ler apenas o primeiro inteiro. Não há conversão ou de transformação, por isso é extremamente rápido.
Para fazer suas consultas usar um índice ... usar esta fórmula na entrada filtragem parâmetros primeiro, ou no "outro" lado do sinal de igual do campo de data e hora tabelas, de modo que o otimizador de consulta não tem que executar o cálculo em todos os campos de data e hora na tabela para determinar quais linhas satisfazer o predicado de filtro. Isso faz com que a sua pesquisa argumento "SARG-able" (Search argumento)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
ao invés de
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* NOTA. Internamente, o segundo número inteiro (a parte da hora) armazena carrapatos. Num dia existem 24 x 60 x 60 x 300 = 25,920,000 carrapatos (por acaso apenas abaixo do valor máximo um número inteiro de 32 bit pode conter). No entanto, você não precisa se preocupar com isso quando aritmeticamente modificando uma data e hora ... Ao adicionar ou subtrair valores de datetimes você pode tratar o valor como uma fração como se fosse exatamente igual à parte fracionária de um dia, como se o valor completo de data e hora era um número de ponto flutuante que consiste de uma porção inteiro que representa a data e a porção fraccionada que representa o tempo). isto é,
`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`