¿Cómo combinar valores de tipo Time y Date en SQL Server?

Publicado Feb 20223 min de lectura
image

Introducción a las funciones

En SQL Server disponemos de las funciones DATEADD() y DATEPART(), las cuales son muy útiles en el caso de tener que añadir un valor de tipo Time a otro de tipo Date para crear un valor de tipo Datetime.

Las funciones DATEADD() y DATEPART() nos permiten añadir u obtener respectivamente un valor numérico como parte de un horario o de una fecha, como pueden ser días, horas y minutos, añadiendo o extrayendo a/de un valor dado de tipo Time o Date.

Ejemplo de DATEADD() que suma un año a la fecha actual (más info):

sql
SELECT DATEADD(year, 1, CURRENT_TIMESTAMP)

Ejemplo de DATEADD() que añade un año a la fecha actual (más info):

sql
SELECT DATEPART(day, GETDATE())

Demostración

El siguiente script sql crea una tabla de test en la que se lleva a cabo la suma en milisegundos de un valor de tipo Time con otro de tipo Date:

sql
-- Crea tabla de test DECLARE @TestTable TABLE ( [MY_DATE] date, [MY_TIME] time, [MY_DATETIME] datetime ); -- Añade un registro en la tabla INSERT INTO @TestTable VALUES ( CONVERT(date, GETDATE()), -- current date CONVERT(time, GETDATE()), -- current time NULL ); -- Establece el valor de MY_DATETIME agregando el tiempo en milisegundos de MY_TIME a MY_DATE UPDATE @TestTable SET MY_DATETIME = DATEADD(millisecond, ( DATEPART(hour,MY_TIME)*3600000 + DATEPART(minute,MY_TIME)*60000 + DATEPART(second,MY_TIME)*1000 + DATEPART(millisecond,MY_TIME) ), CAST(MY_DATE as datetime) ) SELECT * FROM @TestTable

Formulas

A continuación veremos las diferentes formas en las que podemos añadir un horario a una fecha.

Añadir horas:

sql
SELECT DATEADD(hour, DATEPART(hour,MY_TIME), CAST(MY_DATE as datetime))

Añadir horas y minutos:

sql
SELECT DATEADD(minute, ( DATEPART(hour,MY_TIME)*60 + DATEPART(minute,MY_TIME) ), CAST(MY_DATE as datetime) )

Añadir horas, minutos y segundos:

sql
SELECT DATEADD(second, ( DATEPART(hour,MY_TIME)*3600 + DATEPART(minute,MY_TIME)*60 + DATEPART(second,MY_TIME) ), CAST(MY_DATE as datetime) )

Añadir horas, minutos, segundos y milisegundos:

sql
SELECT DATEADD(millisecond, ( DATEPART(hour,MY_TIME)*3600000 + DATEPART(minute,MY_TIME)*60000 + DATEPART(second,MY_TIME)*1000 + DATEPART(millisecond,MY_TIME) ), CAST(MY_DATE as datetime) )