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

Sql server 将Azure上的UTC转换为EST时间(包括夏令时动态版本),sql-server,azure,utc,dst,Sql Server,Azure,Utc,Dst,我有一个关于将UTC时区转换为EST时区的问题,因为我还是SQL语言和Azure平台的新手。在日志文件中,我使用日志文件中的系统内置函数“GetDate()”获取日期/时间。但是,在访问我的SSMS上的Azure数据库时,使用系统内置函数(GetDate())可以获得UTC时区中的datetime,比东部时区(EST)早4小时。在将UTC转换为EST之前,我曾问过类似的问题 ,和@DanGuzman帮助我修复代码。但这个问题更多的是将UTC转换为EST(动态地考虑夏令时)。下面是到目前为止我的代

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

以下代码仅适用于2019年(自夏时制于2019年3月10日开始至2019年11月3日。在日期范围内,以下代码将夏时制时间范围内的美国东部时间提前一小时

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

有人能给我一些建议,如何改进我现有的代码(能够动态工作),这样我就不需要每年都更改函数来调整日光节约。

由于Azure SQL领先于内部部署版本,我想你可以使用语法
选择getutcdate()时区为“UTC”时区为“东部标准时间”
。此外,我会切换到
getutcdate()
,因为无论服务器的TZ如何,这应该是不变的。有关时区为
的更多信息

由于Azure SQL领先于本地版本,我认为您可以使用语法
选择getutcdate()在时区“UTC”在时区“东部标准时间”
。此外,我会切换到
getutcdate()
,因为无论服务器的TZ如何,这应该是不变的。有关
在时区的详细信息

一种方法是将
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

一种方法是将
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

这正是你需要的

选择转换(时区的DATETIME,GETDATE()(选择当前时区的ID())时区的“东部标准时间”)


说明:这将使用
当前时区ID()
获取服务器本地时区中的当前日期时间。然后我们使用
在时区
将其设置为datetimeoffset,然后我们将该datetimeoffset剪切到请求的时区…这里是
“东部标准时间”
。最后,整个过程被包装在
转换()
将datetimeoffset对象剪切为适当的
日期时间
数据类型。

这应该正好满足您的需要

选择转换(时区的DATETIME,GETDATE()(选择当前时区的ID())时区的“东部标准时间”)

说明:这将使用
当前时区ID()
获取服务器本地时区中的当前日期时间。然后我们使用
在时区
将其设置为datetimeoffset,然后我们将该datetimeoffset剪切到请求的时区…这里是
“东部标准时间”
。最后,整个过程被包装在
转换()
将datetimeoffset对象剪切为适当的
datetime
数据类型