Конвертировать UTC в Azure в EST Time (включая летнее время, динамическую версию) - PullRequest
0 голосов
/ 13 января 2019

У меня есть вопрос о преобразовании часового пояса UTC в часовой пояс EST, поскольку я все еще плохо знаком с языком SQL и платформой Azure. В файле журнала я использовал встроенную функцию системы «GetDate ()» в файле журнала, чтобы получить дату / время. Однако при доступе к базе данных Azure в моей SSMS использование встроенной в систему функции (GetDate ()) дает мне дату и время в часовом поясе UTC, что на 4 часа больше, чем в восточном часовом поясе (EST). Я задавал подобный вопрос раньше для преобразования UTC в EST здесь и @DanGuzman помогли мне исправить мой код. Но этот вопрос больше о преобразовании UTC в EST (учитывая летнее время динамически). Ниже приведен мой код, и я использовал эту ссылку в качестве ссылки. Однако я хотел бы сделать мой код динамичным, чтобы я мог продолжать использовать его и в 2020, и в 2021 году.

Приведенный ниже код работает ТОЛЬКО для 2019 года (поскольку переход на летнее время начинается с 10,2019 марта по 3 ноября 2019 года. В диапазоне дат ниже кода переадресация на один час времени EST в диапазоне летнего времени.

CREATE FUNCTION [dbo].[EST_GetDateTime] 
    (
     -- no parameter
     )
RETURNS datetime
AS
BEGIN

 DECLARE
    @EST datetime,  
    @StandardOffset int,

    @DST datetime,  -- Daylight Saving Time
    @SSM datetime, -- Second Sunday in March
    @FSN datetime  -- First Sunday in November

-- get DST Range
set @EST = CAST(DATEADD(hh,-5,GETDATE()) AS DATETIME)

set @StandardOffset = 0

set @SSM = datename(year,@EST) + '0310'  -- Set which day daylight saving start (for 2019, March 10)
set @SSM = dateadd(hour,2,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM))
set @FSN = datename(year,@EST) + '1103'   -- Set which day daylight saving start (for 2019, March 10)
set @FSN = dateadd(second,-1,dateadd(hour,2,dateadd(day,datepart(dw,@FSN)*-1+1,@FSN)))

-- add an hour to @StandardOffset if @EST is in DST range
if @EST between @SSM and @FSN
    set @StandardOffset = @StandardOffset + 1

-- convert to DST
set @EST = CAST(DATEADD(hh,-5+@StandardOffset ,GETDATE()) AS DATETIME)

    RETURN @EST
END
GO

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

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Один метод - это функция, которая преобразует SYSDATETIMEOFFSET() в EST и преобразует результат в datetime:

CREATE FUNCTION dbo.EST_GetDateTime()
RETURNS datetime
AS
BEGIN
RETURN(SELECT CAST(SYSDATETIMEOFFSET() AT TIME ZONE 'Eastern Standard Time' AS datetime)); 
END
GO

--example usage
SELECT dbo.EST_GetDateTime();
GO
0 голосов
/ 13 января 2019

Поскольку Azure SQL опережает локальную версию, я думаю, вы можете использовать синтаксис select getutcdate() at time zone 'UTC' at time zone 'Eastern Standard Time'. Кроме того, я бы переключился на getutcdate(), поскольку это должно быть инвариантным независимо от TZ сервера. Больше информации о at time zone здесь .

...