Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将getdate()转换为EST_Sql_Sql Server_Tsql_Datetime_Getdate - Fatal编程技术网

Sql 将getdate()转换为EST

Sql 将getdate()转换为EST,sql,sql-server,tsql,datetime,getdate,Sql,Sql Server,Tsql,Datetime,Getdate,我想将SQL Server中的getdate()转换为EST时间。您是否考虑过GETUTCDATE()并从那里执行偏移? 如果你指的是标准时间中的EST,那就是UTC-5,所以 select dateadd(hour,-5,GETUTCDATE()) GetDate()是服务器本身的系统时间 取GetDate()现在的时差和它现在处于EST的时间,使用此代码,其中1是所述的时差(在本例中,服务器位于中心时区)(这也假设您的服务器正在考虑DST) 东部标准时间为格林尼治标准时间5小时,而东部标准

我想将SQL Server中的
getdate()
转换为EST时间。

您是否考虑过GETUTCDATE()并从那里执行偏移? 如果你指的是标准时间中的EST,那就是UTC-5,所以

select dateadd(hour,-5,GETUTCDATE())
GetDate()
是服务器本身的系统时间

GetDate()
现在的时差和它现在处于EST的时间,使用此代码,其中1是所述的时差(在本例中,服务器位于中心时区)(这也假设您的服务器正在考虑DST)


东部标准时间为格林尼治标准时间5小时,而东部标准时间为格林尼治标准时间4小时

要获得EST:

select dateadd(hour,-5,GETUTCDATE())
要获得EDT:

select dateadd(hour,-4,GETUTCDATE())
使用GETDATE():

GMT:

将显示日期:

SELECT GETDATE()

EST:

立即使用GETDATE()进行转换:

SELECT DATEADD(HOUR, -4, CONVERT(varchar(20),GETDATE(),120))

如果您正试图使用夏令时输出本地时间,如东部时间,您需要一个函数来检测夏令时的开始和结束,然后应用一个可变偏移量:我发现这个:很有用。

SQL server本身有一个表
current\u utc\u offset
,该表具有正确的夏季和冬季偏移量。 请尝试查询
select*from current_utc_offset
,将日期更改为服务器上的不同季节,然后再次查看该表。 因此,获取EST的正确功能是:

CREATE FUNCTION [dbo].[Getestlocaldatetime] () 
returns DATETIME 
AS 
  BEGIN 
      DECLARE @zz NVARCHAR(12); 
      DECLARE @hh NVARCHAR(3); 
      DECLARE @dd DATETIME; 

      SET @zz = (SELECT current_utc_offset 
                 FROM   sys.time_zone_info 
                 WHERE  NAME = N'US Eastern Standard Time') 
      SET @hh = Substring(@zz, 1, 3); 
      SET @dd = Dateadd(hh, CONVERT(INT, @hh), Getutcdate()) 

      RETURN @dd 
  END 

对于使用最新版本sql server的用户,可以创建.net函数

标量值函数(SVF)返回单个值,例如字符串、整数或位值。您可以使用任何.NET Framework编程语言在托管代码中创建标量值用户定义函数。Transact-SQL或其他托管代码可以访问这些函数。有关CLR集成的优点以及在托管代码和Transact-SQL之间进行选择的信息

由于.NET可以访问操作系统中的所有时区,所以您不必计算夏时制-4或-5基本原理

var timeUtc = DateTime.UtcNow;
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime easternTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);

如果不想调用函数,也可以使用CASE语句。下面的代码将UTC字段转换为山地时间,用于计算夏令时。对于EST,您只需将所有-6更改为-4,并将所有-7更改为-5

--Adjust a UTC value, in the example the UTC field is identified as UTC.Field, to account for daylight savings time when converting out of UTC to Mountain time.
CASE
    --When it's between March and November, it is summer time which is -6 from UTC
    WHEN MONTH ( UTC.Field ) > 3 AND MONTH ( UTC.Field ) < 11 
        THEN DATEADD ( HOUR , -6 , UTC.Field )
    --When its March and the day is greater than the 14, you know it's summer (-6)
    WHEN MONTH ( UTC.Field ) = 3
        AND DATEPART ( DAY , UTC.Field ) >= 14 
        THEN
            --However, if UTC is before 9am on that Sunday, then it's before 2am Mountain which means it's still Winter daylight time.
            CASE 
                WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                    AND UTC.Field < '9:00'
                    --Before 2am mountain time so it's winter, -7 hours for Winter daylight time
                    THEN DATEADD ( HOUR , -7 , UTC.Field )
                --Otherwise -6 because it'll be after 2am making it Summer daylight time
                ELSE DATEADD ( HOUR , -6 , UTC.Field )
            END
    WHEN MONTH ( UTC.Field ) = 3
        AND ( DATEPART ( WEEKDAY , UTC.Field ) + 7 ) <= DATEPART ( day , UTC.Field ) 
        THEN 
            --According to the date, it's moved onto Summer daylight, but we need to account for the hours leading up to 2am if it's Sunday
            CASE 
                WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                    AND UTC.Field < '9:00'
                    --Before 9am UTC is before 2am Mountain so it's winter Daylight, -7 hours
                    THEN DATEADD ( HOUR , -7 , UTC.Field )
                --Otherwise, it's summer daylight, -6 hours
                ELSE DATEADD ( HOUR , -6 , UTC.Field )
            END
    --When it's November and the weekday is greater than the calendar date, it's still Summer so -6 from the time
    WHEN MONTH ( UTC.Field ) = 11
        AND DATEPART ( WEEKDAY , UTC.Field ) > DATEPART ( DAY , UTC.Field ) 
        THEN DATEADD ( HOUR , -6 , UTC.Field )
    WHEN MONTH ( UTC.Field ) = 11
        AND DATEPART ( WEEKDAY , UTC.Field ) <= DATEPART ( DAY , UTC.Field ) 
            --If the weekday is less than or equal to the calendar day it's Winter daylight but we need to account for the hours leading up to 2am.
            CASE 
                WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                    AND UTC.Field < '8:00'
                    --If it's before 8am UTC and it's Sunday in the logic outlined, then it's still Summer daylight, -6 hours
                    THEN DATEADD ( HOUR , -6 , UTC.Field )
                --Otherwise, adjust for Winter daylight at -7
                ELSE DATEADD ( HOUR , -7 , UTC.Field )
            END
    --If the date doesn't fall into any of the above logic, it's Winter daylight, -7
    ELSE
        DATEADD ( HOUR , -7 , UTC.Field )
END
——调整UTC值,在本例中,UTC字段被标识为UTC.field,以说明从UTC转换为山地时间时的夏令时。
案例
--在3月至11月之间,是夏季时间,UTC为-6
当月份(UTC.Field)>3且月份(UTC.Field)<11时
然后添加日期(小时-6,UTC.字段)
--当它的三月和白天大于14时,你知道它是夏天(-6)
当月份(UTC字段)=3时
和日期部分(日期,UTC.字段)>=14
然后
--然而,如果UTC在周日上午9点之前,那么它在凌晨2点之前,这意味着它仍然是冬季白天。
案例
DATEPART(工作日,UTC.字段)=1时
和UTC.字段<'9:00'
--山区时间凌晨2点之前,所以现在是冬天,冬季白天时间为-7小时
然后添加日期(小时-7,UTC.字段)
--否则-6,因为它将在凌晨2点之后,使之成为夏季白天
ELSE DATEADD(小时-6,UTC.字段)
结束
当月份(UTC字段)=3时
和(日期部分(工作日,UTC.Field)+7)日期部分(日期,UTC.Field)
然后添加日期(小时-6,UTC.字段)
当月份(UTC字段)=11时
和日期部分(工作日,UTC现场)更新答案(05-29-2020)

Azure SQL团队已经发布了一个新的版本,这使得这变得更加容易<代码>选择当前时区ID()
将返回服务器的时区。将此函数添加到下面的原始答案中会产生一个查询,该查询将在所有Azure SQL服务器上全局运行

SELECT CONVERT(DATETIME,GETDATE() AT TIME ZONE (SELECT CURRENT_TIMEZONE_ID()) AT TIME ZONE 'Eastern Standard Time')`
此查询将在任何Azure SQL Server上运行

原始答复:

这里有很多答案不必要地复杂,或者不考虑夏令时。不需要大量的
案例
语句。不需要新的存储过程或标量/用户定义函数。从SQL Server 2016开始,可以使用一行本机SQL在时区之间进行转换。这是有好处的。例如,它可以从报表中调用,也可以在只读数据库上使用

SELECT CONVERT(DATETIME,GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time')
就这样。上面,我们正在使用时区的
功能,详细介绍了这些功能。这里可能有一些新的功能和特性,因此有必要进行解释。上面的查询调用
GETDATE()
,并使用
AT timezone
将其时区设置为UTC。隐式地,这也将其数据类型从
datetime
更改为
datetimeoffset
。接下来,我们将再次在时区调用
,将其切换到EST。最后,我们将把整个过程包装在
CONVERT()
中,使其返回到
datetime
,并在过程中删除不必要的+/-小时部分

逐步进行查询

SELECT [GetDate]            = GETDATE()
SELECT [GetDateAtUtc]       = GETDATE() AT TIME ZONE 'UTC'
SELECT [GetDateAtUtcAtEst]  = GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
SELECT [GetDateEst]         = CONVERT(DATETIME,GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time')

选择CONVERT(DATETIME,GETUTCDATE()在时区“UTC”在时区“东部标准时间”)

错误,这不考虑日光节约时间。@AndroidDebaser您不需要考虑日光节约时间。EST将始终为UTC-5。观察者日间节光时间将切换到EDT和OP特别要求EST的地点。所以这个答案是正确的。@Solartic当然,这个答案在技术上是正确的,因为EST通常都是UTC的五分之一。然而,OP最有可能想要一个全年工作的forumula。我说公平,因为人们称之为一年中最公平的。EDT
sys.time\u zone\u info
表中没有条目。因此,虽然这个答案在技术上是正确的,但我认为可以公平地假设OP想要接受UTC日期并将其正确翻译的东西
SELECT CONVERT(DATETIME,GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time')
SELECT [GetDate]            = GETDATE()
SELECT [GetDateAtUtc]       = GETDATE() AT TIME ZONE 'UTC'
SELECT [GetDateAtUtcAtEst]  = GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
SELECT [GetDateEst]         = CONVERT(DATETIME,GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time')