【问题标题】:SQL Server - convert UTC to EST (include Daylight Savings, when appropriate)SQL Server - 将 UTC 转换为 EST(包括夏令时,适当时)
【发布时间】:2021-11-04 12:08:12
【问题描述】:

我有一个表,它以 UTC 时区存储交易日期时间。我需要将此时间转换为东部时区,即 EST 或 EDT,具体取决于交易日期。

如何在不编写大函数或创建表/视图来标记每个交易日期的 EST / EDT 的情况下做到这一点?

【问题讨论】:

    标签: sql-server timezone


    【解决方案1】:

    使用AT TIME ZONE,它将一个值的时区更改为那里的相关时间,并遵守夏令时:

    SELECT CONVERT(datetimeoffset(0),'2021-09-07T15:25:37+00:00') AT TIME ZONE 'Eastern Standard Time' AS Sep21,
           CONVERT(datetimeoffset(0),'2021-01-09T15:25:37+00:00') AT TIME ZONE 'Eastern Standard Time' AS Jan21;
    

    返回以下内容:

    Sep21                              Jan21
    ---------------------------------- ----------------------------------
    2021-09-07 11:25:37 -04:00         2021-01-09 10:25:37 -05:00
    

    【讨论】:

    • 但是,如果您必须处理多个时区(现在或将来),“大函数或表/视图”实际上是更简单的方法。我在这里有一个系列:part 1 | part 2 | part 3。创建一个表来支持业务需求不应该是什么可怕的任务。
    • 感谢您的建议。 CONVERT 函数也返回带有偏移值 (-04:00) 的时间。我需要没有偏移的最终时间值。我从输入日期中删除了偏移量,并尝试使用datetime 而不是datetimeoffset,还尝试将另一个样式参数添加到CONVERT 函数调用SELECT CONVERT(datetime,'2021-09-07 15:25:37', 20) AT TIME ZONE 'Eastern Standard Time' AS Sep21,但仍然在输出中获得偏移值。
    • @Neha 正如 Rob 在我发布的文章中解释的那样,如果您没有像 Larnu 建议的那样包含显式偏移量,则需要让 SQL Server 知道 source 时间zone 是 UTC 的其他方式,例如SELECT Sep21 = CONVERT(datetime, (CONVERT(datetime, '20210907 15:25:37') AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'));。这将返回2021-09-07 11:25:37.000,我认为这就是您所追求的,如this db<>fiddle 所示。
    • @Neha 这里答案中的偏移量只是附加到输出中,通过指定偏移量来指示目标时区(DST 是否到位)。但是您可以轻松地在演示时忽略它或将输出转换为日期时间以显式删除它。 For example.
    猜你喜欢
    • 2020-06-22
    • 2016-04-11
    • 2015-08-04
    • 2018-07-03
    • 1970-01-01
    • 2014-06-01
    • 2021-12-13
    • 2017-09-10
    • 2016-06-14
    相关资源
    最近更新 更多