【问题标题】:Change SQL Server from UTC to LOCAL time将 SQL Server 从 UTC 时间更改为本地时间
【发布时间】:2022-11-23 12:46:48
【问题描述】:

我正在尝试找到一种方法将 SQL Server 从使用 UTC 时间更改为本地时间。这是因为当我通过 excel 使用 ODATA 提取数据时,我需要获取当地时间。

有没有办法将 SQL 服务器从 UTC 配置为本地时间?

【问题讨论】:

  • 您要更改的内容在这里不清楚。您的意思是数据存储在datetimeoffset 中并且您想将偏移量更改为用户的本地时间吗?你的意思是当你使用像GETDATE()这样的函数时,你得到的是 UTC 时间,而不是本地时间?完全是别的东西?
  • 感谢您的回复。基本上当我通过 excel 使用 ODATA 从 Acumatica 提取数据时。显示的时间为 UTC 时间。与实例的时间相比是 -3 小时。我在想,如果我能够将 SQL Server 从以 UTC 时间存储数据更改为本地时间,我可能会解决这个问题

标签: sql-server odata


【解决方案1】:

如果 UTC 日期/时间值存储在 datetimedatetime2smalldatetime 列中,则可以使用 AT TIME ZONE 指示当前值为 UTC 并将该值转换为您选择的时区:

SELECT YourUTCDateTimeColumn AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS YourLocalDateTimeColumn

AT TIME ZONE 返回 datetimeoffset 数据类型。如果 datetimeoffset 对于您的用例有问题,则可以将其转换回源类型:

SELECT CAST(YourUTCDateTimeColumn AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS datetime2(3)) AS YourLocalDateTimeColumn

【讨论】:

    【解决方案2】:

    SQL Server 的本地时区源自本地操作系统。如果您想全局影响 SELECT GetDate() 使用的时区,那么您能够更改服务器的时区。

    • 这是一种通常不推荐用于更大问题的解决方法。

    自 2005 年以来,在 .Net 中处理日期和时间的最佳做法是使用 DateTimeOffset,此建议在 SQL Server 2008 中成为标准。在 DateTime 中存储时间是一种反模式,它会强制进行大量操作,但更糟, 它迫使很多假设,例如你如何知道该值是本地时间或 UTC,然后使用了哪个本地时区,是否是夏令时?

    DateTimeOffset 为我们提供了对可能在不同时区输入的值的正确排序和时差计算,在我的博客中阅读更多内容:Why was DateTime removed from OData v4

    如果您通过 OData API 进行查询,那么您可以在 API 逻辑中实现时区转换,或者您可以通过中间件、自定义序列化或其他注入技术直接操作 SQL 查询。然而,要深入细节,您需要发布相关代码。

    This answer from @Dan Guzman 展示了一些直接在 SQL 查询中使用 AT TIME ZONE 的示例,这是在 SQL Server 2016 中引入的。您可能也对 TODATETIMEOFFSET()SWITCHOFFSET() 感兴趣,但实现这些功能仍然需要对特定时区的假设要么被硬编码到 API 逻辑中,要么从客户端传递。

    可以做到,但是当在 Excel 中使用数据时,通过来自 SQL 数据库的 OData API,有多个点可以实现转换逻辑,因此有多个合理的解决方案。

    别忘了,您可以将此时区逻辑应用为 Excel 中的转换步骤数据已被检索。我希望这篇文章能激励您进一步研究并选择特定的途径。然后,如果您遇到困难,请发布一个更有针对性的问题,详细说明您的具体尝试。我们是来帮忙的;)

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2010-11-15
      • 2013-07-30
      相关资源
      最近更新 更多