【问题标题】:GETUTCDATE() and Time Zone (SQL Server)GETUTCDATE() 和时区 (SQL Server)
【发布时间】:2018-01-31 21:43:05
【问题描述】:

我想在 SQL Server 中使用函数 GETUTCDATE() 添加我的时区。我搜索了几次,但没有找到任何相关的解决方案。提前致谢。

【问题讨论】:

  • 使用SYSDATETIMEOFFSET() 代替GETUTCDATE。它将返回一个包含机器时区偏移量的datetimeoffset 值。如果您想将此切换到另一个偏移量,请使用SWITCHOFFSET

标签: sql-server database


【解决方案1】:

仅适用于 sql 2016,它考虑了夏令时。

CREATE FUNCTION GetBelgiumTime 
(
)
RETURNS datetime2
AS BEGIN  
       declare @dateoffset datetimeoffset
       SET  @dateoffset = convert(VARCHAR(2000),(SELECT GETUTCDATE() AT TIME ZONE  'Central European Standard Time'),126 )


       declare @date datetime2
       set @date = convert(datetime2, LEFT(@dateoffset,28),126)

    set @date = DATEADD(HOUR, convert(int,LEFT(RIGHT(@dateoffset,5), 2)), @date) 
       RETURN @date
END

select  dbo.GetBelgiumTime() as BelgiumDateAndTime 

【讨论】:

  • 所有与 varchars 和 dateadd 之间的转换都是不必要的。只需使用SYSDATETIMEOFFSET 而不是GETUTCDATEAT TIME ZONE 就会正确转换。
【解决方案2】:

从 SQL Server 2016 开始(和 Azure SQL DB),您可以这样做:

SELECT SYSDATETIMEOFFSET() AT TIME ZONE @tz

其中@tz 是有效的 Windows 时区标识符,例如 'Pacific Standard Time''Central European Standard Time' 等。

但是,如果您使用的是旧版本的 SQL Server,或者更喜欢使用 IANA 时区标识符,则可以使用我的 SQL Server Time Zone Support 项目执行以下操作:

SELECT Tzdb.UtcToLocal(GETUTCDATE(), @tz)

其中@tz 是 IANA 标准时区名称,例如 'America/Los_Angeles''Europe/Budapest'

【讨论】:

    【解决方案3】:

    使用GETDATE() 代替GETUTCDATE()。看到这个link

    【讨论】:

      【解决方案4】:

      您可以尝试像这样使用switchoffset

      select switchoffset(CAST(myDate as datetimeoffset),'+05:30')  from someTable
      

      您可以指定您的时区值,而不是 '+05:30'

      如果您想通过 GETUTCDATE() 使用时区,那么只需像这样添加它

      select cast(GETUTCDATE() as varchar(20)) + '+5:30'
      

      如果您只想将其保留为日期

      select  switchoffset(CAST(GETUTCDATE() as datetimeoffset),'+05:30')
      

      【讨论】:

      • 这不是夏令时。失败
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      相关资源
      最近更新 更多