Преобразовать столбец Datetime из UTC в местное время в операторе выбора - PullRequest
173 голосов
/ 07 ноября 2011

Я делаю несколько запросов на выборку SQL и хотел бы преобразовать свой столбец даты и времени UTC в местное время, чтобы оно отображалось как местное время в результатах моего запроса. Обратите внимание, я не собираюсь делать это преобразование с помощью кода, а скорее, когда я выполняю ручные и случайные запросы SQL к моим базам данных.

Ответы [ 23 ]

0 голосов
/ 22 августа 2014

Вот более простой способ, который принимает dst к учету

CREATE FUNCTION [dbo].[UtcToLocal] 
(
    @p_utcDatetime DATETIME 
)
RETURNS DATETIME
AS
BEGIN
    RETURN DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), @p_utcDatetime), GETDATE())
END
0 голосов
/ 01 октября 2014

В качестве предупреждения - если вы собираетесь использовать следующее (запишите миллисекунды вместо минут):

    SELECT DATEADD(ms, DATEDIFF(ms, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) 
    AS ColumnInLocalTime
    FROM MyTable

Имейте в виду, что часть DATEDIFF не всегда возвращает один и тот же номер. Поэтому не используйте его для сравнения DateTimes с точностью до миллисекунд.

0 голосов
/ 03 ноября 2016

Я обнаружил, что эта функция быстрее, чем другие решения, использующие отдельную таблицу или циклы.Это просто базовое утверждение.Учитывая, что все месяцы между апрелем и октябрем имеют смещение на -4 часа (восточное время), нам просто нужно добавить еще несколько строк падежа для крайних дней.В противном случае смещение составляет -5 часов.

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

USE [YourDatabaseName]
GO

/****** Object:  UserDefinedFunction [dbo].[ConvertUTCtoEastern]    Script Date: 11/2/2016 5:21:52 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE FUNCTION [dbo].[ConvertUTCtoEastern]
(
@dtStartDate DATETIME
)
RETURNS DATETIME
AS
BEGIN
DECLARE @Working DATETIME
DECLARE @Returned DATETIME

SET @Working = @dtStartDate
SET @Working = 
case when month(@Working) between 4 and 10 then dateadd(HH,-4,@Working) 
     when @Working between '2017-03-12' and '2017-11-05' then dateadd(HH,-4,@Working) 
     when @Working between '2016-03-13' and '2016-11-06' then dateadd(HH,-4,@Working) 
     when @Working between '2015-03-08' and '2015-11-01' then dateadd(HH,-4,@Working) 
     when @Working between '2014-03-09' and '2014-11-02' then dateadd(HH,-4,@Working) 
     when @Working between '2013-03-10' and '2013-11-03' then dateadd(HH,-4,@Working) 
     when @Working between '2012-03-11' and '2012-11-04' then dateadd(HH,-4,@Working) 
else dateadd(HH,-5,@Working) end

SET @Returned = @Working

RETURN @Returned

END


GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...