Dados os seguintes componentes
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Qual é a melhor maneira de combiná-los para produzir um DATETIME2(7)
resultado com valor '2013-10-13 23:59:59.9999999'
?
Algumas coisas que não funcionam estão listadas abaixo.
SELECT @D + @T
A data do tipo de dados do operando é inválida para o operador add.
SELECT CAST(@D AS DATETIME2(7)) + @T
O tipo de dados do operando datetime2 é inválido para o operador add.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
A função datatediff resultou em um estouro. O número de datas que separam duas instâncias de data / hora é muito grande. Tente usar datediff com um período menos preciso.
* O estouro pode ser evitado no Banco de Dados SQL do Azure e no SQL Server 2016, usando DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Os tipos de dados datetime e time são incompatíveis no operador add.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Retorna um resultado, mas perde precisão
2013-10-13 23:59:59.997
Para o SQL Server 2012 e superior, há a função DATETIME2FROMPARTS . Tem esta forma:
Para os dados de amostra fornecidos, isso se torna
o que resulta em
As partes podem ser obtidas usando DATEPART () se iniciando com tipos de dados temporais ou com o texto usado para construir os valores de amostra na pergunta.
fonte
É muito estúpido do SQL Server não deixar seu primeiro exemplo funcionar, e isso também vai parecer muito idiota, mas…
fonte
fonte
Eu estava procurando por outra coisa quando cheguei aqui. A questão é bastante antiga, mas há alguns comentários e atividades recentes. Pensei em compartilhar um método simples que é muito semelhante à resposta que @Atario deu, mas um pouco mais curto e alguns podem achar mais fácil de ler:
fonte
Você pode truncar a conversão com para DATE para truncar e voltar para DATETIME para adicionar o TIME
fonte