Puoi farlo come segue su SQL Server 2008 o versioni successive:
SELECT CONVERT(datetime,
SWITCHOFFSET(CONVERT(datetimeoffset,
MyTable.UtcColumn),
DATENAME(TzOffset, SYSDATETIMEOFFSET())))
AS ColumnInLocalTime
FROM MyTable
Puoi anche fare il meno dettagliato:
SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn)
AS ColumnInLocalTime
FROM MyTable
Qualunque cosa tu faccia, non usa -
per sottrarre le date, perché l'operazione non è atomica e in alcune occasioni otterrai risultati indeterminati a causa delle condizioni di gara tra il sistema datetime e il datetime locale verificate in momenti diversi (cioè non atomicamente).
Si noti che questa risposta non tiene conto dell'ora legale. Se desideri includere una correzione dell'ora legale, consulta anche la seguente domanda SO:
Come creare la funzione di inizio e fine dell'ora legale in SQL Server