¿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):

SELECT DATEADD(year, 1, CURRENT_TIMESTAMP)

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

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:

-- 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:

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

Añadir horas y minutos:

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

Añadir horas, minutos y segundos:

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:

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)
		      )