将Azure上的UTC转换为EST时间(包括夏令时动态版本)

时间:2019-01-12 22:56:01

标签: sql-server azure utc dst

我对将UTC时区转换为EST时区有疑问,因为我还是SQL语言和Azure平台的新手。在日志文件中,我使用了日志文件中的系统内置函数“ GetDate()”来获取日期/时间。但是,在我的SSMS上访问Azure数据库时,使用系统内置函数(GetDate())给我的日期时间是UTC时区,比美国东部时区(EST)早4小时。在将UTC转换为EST here之前,我曾问过类似的问题 ,@ DanGuzman帮助我修复了代码。但是,这个问题更多是关于将UTC转换为EST(动态考虑夏令时)。以下是到目前为止的代码,我使用了this链接作为参考。但是,我想使代码动态化,以便在2020年,2021年也能继续使用它。

以下代码仅在2019年有效(自夏令时开始于2019年3月10日至2019年11月3日。在日期范围内,以下代码在夏令时范围内向前推进1小时的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

有人可以提出任何建议来改进我现有的代码(能够动态工作),以便我不需要每年更改功能来调整日光节约时间。

3 个答案:

答案 0 :(得分:1)

由于Azure SQL高于本地版本,所以我认为您可以使用语法select getutcdate() at time zone 'UTC' at time zone 'Eastern Standard Time'。另外,我将切换到getutcdate(),因为无论服务器的TZ如何,它都应该是不变的。有关at time zone here的更多信息。

答案 1 :(得分:1)

一种方法是将SYSDATETIMEOFFSET()转换为EST并将结果转换为日期时间的函数:

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

答案 2 :(得分:0)

这应该完全满足您的需求。

SELECT CONVERT(DATETIME,GETDATE() AT TIME ZONE (SELECT CURRENT_TIMEZONE_ID()) AT TIME ZONE 'Eastern Standard Time')

说明:这将使用CURRENT_TIMEZONE_ID()获取服务器本地时区中的当前日期时间。然后,我们使用AT TIME ZONE将其设置为datetimeoffset,然后将该datetimeoffset剪切为请求的时区...在此处'Eastern Standard Time'。最后,将整个内容包装在CONVERT()中,以将datetimeoffset对象剪切为适当的datetime数据类型。