在 tsql 中引入具有特定时区的日期时间,并将其转换为另一个时区



我正在处理一个从表中获取日期的过程。在该表中,它存在两个列:[日期],[时区]
示例:
(origin table) L [Date] | [TimeZone]<br> 0 00:00 America/Los_Angeles<br> 1 14:00 America/Anchorage<br> 2 10:00 Europe/London<br> 如您所见,有不同的时间和时区。我想实现的是利用每一个时代并将其转换为欧洲/马德里。转换后将存储数据的表命运应如下所示:

(Destiny table) L [Date] | [TimeZone]<br> 0 09:00 Europe/Madrid ( +9 hours )<br> 1 00:00 Europe/Madrid ( +10 hours ) <br> 2 11:00 Europe/Madrid ( +1 hour )<br>

当然,请记住,DST 可能会影响任何时区。

我知道这有点棘手,但任何帮助都会很棒。 提前非常感谢你。

我尝试使用时区命令,但我的主要问题是我不知道如何将作为日期时间变量的数据修复到特定时区

示例:
在时区"中欧标准时间"选择转换(日期时间,"2019 年 7 月 19 日上午 9:00")

例如,我不知道如何指定日期( Jul 19 2019 9:00AM )在美国/Los_Angeles时区。

您面临的挑战似乎是您拥有 IANA 时区标识符(例如'America/Los_Angeles'),而不是 Windows 时区标识符(例如'Eastern Standard Time')。 有关此内容的更多信息,请参阅标题为"时区数据库"部分中的时区标记 wiki。

您可以通过几种不同的方式使用 IANA 标识符:

  • AT TIME ZONE命令适用于操作系统的时区。 因此,当您在Windows上运行SQL Server时,它使用Windows时区标识符。 相反,如果您在Linux上运行SQL Server,则可以直接使用IANA时区标识符。

    SELECT yourDateTime AT TIME ZONE 'America/Los_Angeles' AT TIME ZONE 'Europe/Madrid'
    

    请注意,此处有两个调用AT TIME ZONE。 第一个断言源时区,从给定的datetime(或datetime2)创建一个datetimeoffset。 第二个将datetimeoffset转换为目标时区,从而生成一个datetimeoffset,并适当调整本地时间和偏移量。

    下面的其余方法假定您在 Windows 上运行。

  • 您可以编写一个外部应用程序,将时区标识符从 IANA 转换为 Windows。 您可以更新现有字段,也可以填充辅助字段。 例如,如果您正在编写 .NET 应用程序,则可以使用我的 TimeZoneConverter 库进行翻译。 然后,您将使用相应的 Windows 区域运行与上述相同的查询。 例如:

    SELECT yourDateTime AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'Romance Standard Time'
    
  • 您可以将 CLDRwindowsZones.xml文件导入到表中。 此文件包含两种不同时区标识符类型之间的大部分转换数据。然后,您可以在查询时联接到该表。

  • 您可以使用我的 SQL Server 时区支持包。 它有点旧,但它仍然有效。 这会将 IANA 时区数据导入到 SQL Server 中的表中,并提供转换功能。 例如:

    SELECT Tzdb.ConvertZone(yourDateTime, 'America/Los_Angeles', 'Europe/Madrid', 1, 1)
    
  • 您可以在外部应用程序中进行所有时区转换。 可以使用前面所示的 TimeZoneConverter,以及 .NET 中的TimeZoneInfo类。 或者,您可以使用 Noda Time 和 IANA(又名 TZDB)标识符。 其他编程语言中也有类似的包。

最新更新