Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Melhor abordagem para remover parte da hora do datetime no SQL Server


Estritamente, o método a é o menos intensivo em recursos:
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Comprovadamente menos intensivo de CPU para a mesma duração total de um milhão de linhas por alguém com muito tempo disponível:A maneira mais eficiente no SQL Server de obter uma data de data+hora?

Eu vi um teste semelhante em outro lugar com resultados semelhantes também.

Eu prefiro o DATEADD/DATEDIFF porque:
  • varchar está sujeito a problemas de idioma/formato de data
    Exemplo:por que minha expressão CASE não é determinística?
  • float depende de armazenamento interno
  • ele se estende para o primeiro dia do mês, amanhã, etc., alterando a base "0"

Editar, outubro de 2011

Para SQL Server 2008+, você pode CAST para date ou seja, CAST(getdate() AS date) . Ou apenas use date tipo de dados, então não há time remover.

Editar, janeiro de 2012

Um exemplo trabalhado de como isso é flexível:precisa calcular por hora ou data arredondada no servidor sql

Editar, maio de 2012

Não use isso em cláusulas WHERE e similares sem pensar:adicionar uma função ou CAST a uma coluna invalida o uso do índice. Veja o número 2 aqui Erros comuns de programação SQL

Agora, isso tem um exemplo de versões posteriores do otimizador do SQL Server gerenciando o CAST até o momento corretamente, mas geralmente será uma má ideia...

Editar, setembro de 2018, para datetime2
DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)