Eu preciso adicionar a parte da data à parte do GetDate()
tempo de um arquivo DateTime
.
Ingenuamente, pensei que poderia fazer o seguinte:
declare @testTime DateTime = '2013-04-23 13:55:06'
select cast(getdate() as date) + cast(@testTime as time)
mas esta dando o seguinte erro:
A data do tipo de dados do operando é inválida para o operador de adição.
Eu fiz mais algumas pesquisas e descobri três maneiras possíveis de fazer o cálculo:
declare @testTime DateTime = '2013-04-23 13:55:06'
select dateadd(dd, 0, DATEDIFF(dd, 0, GetDate())) + cast(@testTime as time)
select cast(cast(GetDate() as date) as datetime) + cast(@testTime as time)
select dateadd(day, datediff(day, @testTime, GetDate()), @testTime)
Todos os três produzem o mesmo resultado, mas não estou 100% satisfeito com a implementação de nenhum deles, embora a terceira maneira pareça ser uma maneira melhor - embora não tenha evidências disso.
Qual (se houver) dos três é o mais eficiente?
Existe uma maneira melhor?
Você poderia usar DATETIMEFROMPARTS (Transact-SQL)
Atualizar:
As duas primeiras de suas consultas.
exigem que o nível de compatibilidade do banco de dados seja SQL Server 2008(100). Se eles forem executados no nível de compatibilidade (110) ou (120), você obterá
então você não deve considerá-los.
A última consulta
funciona muito bem.
Fiz um teste com mais de 1000000 linhas no SQL Server 2014 e a
datetimefromparts
versão demorou 650 ms edateadd/datediff
demorou 350 ms.Testado apenas no SQL 2005:
Porque como?
Alguns argumentarão que eu não deveria confiar em partes internas não documentadas de estruturas de dados no código. Isso pode ser verdade. Mas se, por algum motivo, o desempenho for importante o suficiente, acho que o CAST deve ser mais rápido. Eu não fiz nenhum timing.