SQL Server - конвертировать поле даты в UTC - PullRequest
48 голосов
/ 23 апреля 2010

Я недавно обновил свою систему, чтобы записывать дату / время в формате UTC, как ранее они хранили в качестве местного времени.

Теперь мне нужно преобразовать все локальные сохраненные дату / время в UTC. Мне было интересно, есть ли какая-либо встроенная функция, похожая на метод .NET ConvertTime?

Я пытаюсь избежать написания служебного приложения, чтобы сделать это для меня.

Есть предложения?

Ответы [ 13 ]

0 голосов
/ 06 июля 2017

Мы можем конвертировать ServerZone DateTime в UTC и UTC в ServerZone DateTime

Просто запустите следующие сценарии, чтобы понять преобразование, затем измените его так, как вам нужно

--Get Server's TimeZone
DECLARE @ServerTimeZone VARCHAR(50)
EXEC MASTER.dbo.xp_regread 'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\TimeZoneInformation',
'TimeZoneKeyName',@ServerTimeZone OUT

-- ServerZone to UTC DATETIME
DECLARE @CurrentServerZoneDateTime DATETIME = GETDATE()
DECLARE @UTCDateTime  DATETIME =  @CurrentServerZoneDateTime AT TIME ZONE @ServerTimeZone AT TIME ZONE 'UTC' 
--(OR)
--DECLARE @UTCDateTime  DATETIME = GETUTCDATE()
SELECT @CurrentServerZoneDateTime AS CURRENTZONEDATE,@UTCDateTime AS UTCDATE

-- UTC to ServerZone DATETIME
SET @CurrentServerZoneDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE @ServerTimeZone
SELECT @UTCDateTime AS UTCDATE,@CurrentServerZoneDateTime AS CURRENTZONEDATE

Примечание : Этот (AT TIME ZONE) работает только на SQL Server 2016 + , и это преимущество автоматически учитывает дневной свет при преобразовании в определенный часовой пояс

0 голосов
/ 09 июня 2014

В зависимости от того, как далеко вам нужно пройти, вы можете создать таблицу перехода на летнее время, а затем присоединиться к ней и выполнить преобразование с учетом dst. Этот конкретный преобразует из EST в GMT (т.е. использует смещения 5 и 4).

select createdon, dateadd(hour, case when dstlow is null then 5 else 4 end, createdon) as gmt
from photos
left outer join (
          SELECT {ts '2009-03-08 02:00:00'} as dstlow, {ts '2009-11-01 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2010-03-14 02:00:00'} as dstlow, {ts '2010-11-07 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2011-03-13 02:00:00'} as dstlow, {ts '2011-11-06 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2012-03-11 02:00:00'} as dstlow, {ts '2012-11-04 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2013-03-10 02:00:00'} as dstlow, {ts '2013-11-03 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2014-03-09 02:00:00'} as dstlow, {ts '2014-11-02 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2015-03-08 02:00:00'} as dstlow, {ts '2015-11-01 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2016-03-13 02:00:00'} as dstlow, {ts '2016-11-06 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2017-03-12 02:00:00'} as dstlow, {ts '2017-11-05 02:00:00'} as dsthigh
UNION ALL SELECT {ts '2018-03-11 02:00:00'} as dstlow, {ts '2018-11-04 02:00:00'} as dsthigh
    ) dst
    on createdon >= dstlow and createdon < dsthigh
0 голосов
/ 03 декабря 2012

Следующее должно работать, так как оно рассчитывает разницу между DATE и UTCDATE для сервера, на котором вы работаете, и использует это смещение для вычисления UTC-эквивалента любой даты, которую вы ему передаете. В моем примере я пытаюсь преобразовать UTC-эквивалент для '1-nov-2012 06:00' в Аделаиде, Австралия, где смещение UTC составляет -630 минут, что при добавлении к любой дате приведет к эквиваленту UTC любой локальной даты.

выберите DATEADD (МИНУТА, DATEDIFF (МИНУТА, GETDATE (), GETUTCDATE ()), '1 ноября 2012 г., 06:00')

...