首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Azure上的UTC转换为EST时间(包括夏令时-动态版本)

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

Stack Overflow用户
提问于 2019-01-13 06:56:01
回答 3查看 2.5K关注 0票数 0

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

以下代码仅适用于2019年(因为夏令时从2019年3月10日开始,直到2019年11月3日。在日期范围内,下面的代码在夏令时范围内将美国东部夏令时向前推进一小时。

代码语言:javascript
运行
复制
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

谁能给我任何建议,如何改善我现有的代码(能够动态工作),使我不需要改变功能,每年调整夏令时。

EN

回答 3

Stack Overflow用户

发布于 2019-01-13 08:12:31

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

票数 1
EN

Stack Overflow用户

发布于 2019-01-13 08:18:31

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-06-04 02:23:09

这应该就是您所需要的。

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数据类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54164629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档