Introduzione alle funzioni
In SQL Server abbiamo le funzioni DATEADD() e DATEPART(), che sono molto utili nel caso in cui si debba aggiungere un valore di tipo Time ad un altro di tipo Date per creare un valore di tipo DateTime.
Le funzioni DATEADD() e DATEPART() consentono rispettivamente di aggiungere o ottenere un valore numerico come parte di un'ora o di una data, come giorni, ore e minuti, aggiungendo o estraendo a/da un valore di tipo Ora o Data.
Esempio di DATEADD() che aggiunge un anno alla data corrente (più info):
SELECT DATEADD(year, 1, CURRENT_TIMESTAMP)
Esempio di DATEPART() che ottiene il giorno del mese della data corrente (più info):
SELECT DATEPART(day, GETDATE())
Dimostrazione
Il seguente script sql crea una tabella di test in cui viene effettuata la somma in millisecondi di un valore di tipo Time con un altro di tipo Date:
-- Crea tabella di prova
DECLARE @TestTable TABLE (
[MY_DATE] date,
[MY_TIME] time,
[MY_DATETIME] datetime
);
-- Aggiunge un record nella tabella
INSERT INTO @TestTable VALUES (
CONVERT(date, GETDATE()), -- current date
CONVERT(time, GETDATE()), -- current time
NULL
);
-- Imposta il valore di MY_DATETIME aggiungendo il tempo in millisecondi da 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
Formule
Successivamente vedremo i diversi modi in cui possiamo aggiungere un'ora a una data.
Aggiunge ore:
SELECT DATEADD(hour, DATEPART(hour,MY_TIME), CAST(MY_DATE as datetime))
Aggiunge ore e minuti:
SELECT DATEADD(minute, (
DATEPART(hour,MY_TIME)*60 +
DATEPART(minute,MY_TIME)
),
CAST(MY_DATE as datetime)
)
Aggiunge ore, minuti e secondi:
SELECT DATEADD(second, (
DATEPART(hour,MY_TIME)*3600 +
DATEPART(minute,MY_TIME)*60 +
DATEPART(second,MY_TIME)
),
CAST(MY_DATE as datetime)
)
Aggiunge ore, minuti, secondi e millisecondi:
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)
)