【问题标题】:T-SQL Get Hours Offset from Name of TimezoneT-SQL 获取时区名称的小时偏移量
【发布时间】:2015-10-02 13:58:08
【问题描述】:

TimeZoneId 字段的 DB 中,我有这样的字符串值:

GMT Standard Time
W. Europe Standard Time
Romance Standard Time
FLE Standard Time

我需要通过这些字符串值来获得 int 值偏移量,即

GMT Standard Time       | 0
W. Europe Standard Time | 1
Romance Standard Time   | 1
FLE Standard Time       | 2

所有字符串值: https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx

我只需要使用 T-SQL。

【问题讨论】:

  • 我认为SQL Server中没有这样的东西。我认为此信息来自 Windows 操作系统。您必须在数据库中创建这样的表,或者编写一个 .Net 函数来完成这项工作。
  • 这些字符串是如何进入您的数据库的?找到执行此操作的进程并对其进行修改以添加偏移量。
  • 你需要一个字符串值表来偏移。
  • 另外请注意,您需要以分钟为单位的偏移量,而不是小时数,因为有些地方的分钟数是奇数。目前似乎到处都是最近的一刻钟,但谁能说这是否会一直如此?
  • 并且由于 DST 和其他原因,偏移量会发生变化。不要使用偏移量来表示时区。请参阅下面的答案。

标签: sql-server tsql timezone offset


【解决方案1】:

一些事情:

  • 您提供的链接严重过时,仅适用于 Windows Embedded POS 1.1。通过在注册表中查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones,或在.NET 中查看TimeZoneInfo.GetSystemTimeZones(),或在命令提示符下调用tzutil /L,可以找到更准确的Windows 时区列表。

  • 您要求的内容无效,因为时区不能用单个数字表示。时区包括夏令时偏移量的变化,以及每年的历史变化。请参阅timezone tag wiki 中的“时区!= 偏移量”。

  • 使用时区通常最好在应用层而不是数据库中完成。在 DB 层只有少数场景需要它。如果您不是绝对需要在数据库中执行此操作,请不要这样做。

  • 与其他数据库平台不同,SQL Server 没有内置的时区转换功能。

  • 要添加时区转换功能,您需要维护时区数据表,并编写转换函数以使用该数据。数据经常变化,因此保持最新很重要。

  • 幸运的是,我已经为您完成了大部分工作。你可以使用我的SQL Server Time Zone Support 项目。它目前适用于 IANA / TZDB 时区(例如 America/New_YorkEurope/London)而不是 Windows 时区,但它适用于 is on the to-do list。你可以等待这个功能,或者convert to IANA zones if you like

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2011-02-28
    • 1970-01-01
    • 2020-12-28
    • 2014-02-15
    • 2021-04-11
    • 2020-01-02
    • 2020-04-20
    • 2016-08-06
    相关资源
    最近更新 更多