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