Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti la colonna Datetime da UTC a ora locale nell'istruzione select

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