【问题标题】:UTC to EST SQL Server 2008UTC 到 EST SQL Server 2008
【发布时间】:2018-02-14 04:52:13
【问题描述】:

我们在 SQL Server 2008 中有数据,其中包含多个日期时间列。由于 SQL Server 中的日期格式是一个大整数值,即自 1970 年以来的秒数,我们使用DATEADD() 函数将其转换为实际的日期时间格式。但是我们面临的问题是,当我们使用 DATEADD() 时,我们获取的是 UTC 时区的数据,而我们想要的是 EST 中的数据。从那时起,我尝试简单地使用 -4 HR,但在 11 月至 3 月期间,我们领先 1 小时,因为当白天时间关闭时,差异为 5 小时。是否可以使用任何考虑夏令时的功能。任何帮助表示赞赏。

Current Function -> DATEADD(s, columnName, '01/01/1970 00:00:00')

问候,萨希尔

【问题讨论】:

  • 没有任何原生的。这是非常困难的。多年来,夏令时的日期发生了变化。有些州不承认夏令时。甚至整个亚利桑那州都不承认夏令时。这只是美国的并发症。一旦你走出这些边界,它就会变得更加复杂。
  • 有整个库是严格编写的,用于处理日期/时间(像 NodaTime、Momentjs 等),但我知道的不是 Sql Server,因为这通常是在应用层解决,而不是持久层。
  • 您可以导入包装 TimeZoneInfo 类并从 Windows 注册表值中读取时区偏移量的程序集(与 Windows 相同)。当您应用 Windows 更新时,这些值会得到零星的更新。时区信息不仅会按计划(DST 或其他)进行更改,而且还会根据地区和国家/地区认为合适的情况临时更改。我会使用一个经过测试的库并将其导入 sql server。

标签: sql sql-server sql-server-2008 datetime dst


【解决方案1】:

试试这个:

DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), columnName) 

【讨论】:

  • 这仅在我们希望时间转换为当前时间时才有效——即当前是否为夏令时。我相信 OP 在一年中都有日期时间,需要根据字段的日期从 UTC 转换为 EST。
【解决方案2】:

您可以为此使用我的SQL Server Time Zone Support 项目。它使用 IANA 标准时区名称,as listed here

以您的示例为基础,以下代码首先从 UNIX 时间戳转换为基于 UTC 的 datetime,然后转换为美国东部时区的 datetime

SELECT Tzdb.UtcToLocal(DATEADD(s, columnName, '1970-01-01 00:00:00'), 'America/New_York')

【讨论】:

    【解决方案3】:

    我会编写一个与时间数据库(例如来自 worldtimeserver.com 的数据库)交互的 UDF——我不隶属于他们,并且通过快速的互联网搜索找到了它。

    进一步的研究表明 timezonedb.com 拥有免费(如果非商业)会员资格,允许下载数据库并提供有关如何与 SQL Server 和 MySQL 一起使用的示例。

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 2018-09-07
      • 1970-01-01
      • 2021-11-04
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多