Dados los siguientes componentes
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
¿Cuál es la mejor manera de combinarlos para producir un DATETIME2(7)
resultado con valor '2013-10-13 23:59:59.9999999'
?
Algunas cosas que no funcionan se enumeran a continuación.
SELECT @D + @T
La fecha del tipo de datos del operando no es válida para agregar operador.
SELECT CAST(@D AS DATETIME2(7)) + @T
El tipo de datos de operando datetime2 no es válido para agregar operador.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
La función dateiff resultó en un desbordamiento. El número de partes de fecha que separan dos instancias de fecha / hora es demasiado grande. Intente usar dateiff con una parte de fecha menos precisa.
* El desbordamiento se puede evitar en Azure SQL Database y SQL Server 2016, utilizando DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Los tipos de datos datetime y time son incompatibles en el operador add.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Devuelve un resultado pero pierde precisión
2013-10-13 23:59:59.997
Para SQL Server 2012 y superior, existe la función DATETIME2FROMPARTS . Tiene esta forma:
Para los datos de muestra dados esto se convierte en
lo que resulta en
Las partes se pueden obtener utilizando DATEPART () si se parte de tipos de datos temporales o del texto utilizado para construir los valores de muestra en la pregunta.
fuente
Es bastante estúpido que SQL Server no permita que su primer ejemplo funcione, y esto también parecerá realmente tonto, pero ...
fuente
fuente
Estaba buscando algo más cuando aterricé aquí. La pregunta es bastante antigua, pero hay algunos comentarios y actividades recientes. Pensé que compartiría un método simple que es muy similar a la respuesta que dio @Atario, pero un poco más corto y algunos podrían ser más fáciles de leer:
fuente
Puede truncar con Cast a DATE para truncar, luego volver a DATETIME para agregar la HORA
fuente