>我在表格中有 5000+ 个机场代码(带纬度、经度),时区列表在主表中可用,其中包含以下时区:http://support.microsoft.com/kb/973627。
如何将时区映射到机场代码?对于相同的偏移量,我们可以有多个时区。示例:GMT-06:00 具有多个时区名称。
网站上提供的映射列表与链接中的时区名称不同。
这不是SQL Server本身可以做的事情,您必须自己将纬度/纬度映射到时区,请参阅 http://timezonedb.com/以获取可能对您有所帮助的开源数据集。
注意 Windows XP 的 Windows 时区列表无效。它在过去已经改变了几次,最近一次是在几个月前。在任何情况下,Windows 时区名称都不会用于旅行或其他任何地方。
GMT-6 不是时区,而是偏移量。时区是在 IANA 数据库中找到的时区,例如。 RussiaMoscow
.根据一年中的时间,偏移量会发生变化。实际上,俄罗斯时区在过去十年中发生了多次变化,因此您需要知道完整的日期才能计算偏移量。
IANA 数据库包含所有时区以及计算其偏移量的规则,可追溯到 19 世纪。
您的机场参考表应包含机场代码和时区,以解析客户端代码中的偏移量。存储偏移量是不切实际的。它们不仅会发生变化,而且没有固定的日期来标记从冬季到夏令时的变化。
我知道当您要计算旅行持续时间时,这有点痛苦。如果计算数量不是很大,则可以在客户端执行所有操作。IANA 数据库并不大,通常嵌入在库中,这意味着每次计算都会花费几个 CPU 周期。另一种选择是创建一个 SQLCLR 程序集以在服务器上执行转换。即使是大型旅行社(如欧洲前 10 名)也不需要这样做。
在 Linux 系统中,IANA 时区数据库是操作系统的一部分,您可以通过系统调用来解决偏移量。在 Windows 中,您可以使用像 NodaTime 这样的库将时区解析为偏移量。
IANA 数据库会定期更新。嵌入它的库必须使用新数据重新编译,这意味着您还必须更新您使用的任何数据。
所有机场参考数据,例如来自 Flightstats 或其他提供商的数据始终包含时区。
如果您关心机场时区,则应避免在 SQL Server 中使用datetime
,并尽可能使用datetimeoffset
。与其假设所有旅行日期都是当地日期(因此需要机场查找和转换),不如明确说明。无论如何,所有航空公司都会发布带有有效偏移量的时间表。这可以使持续时间计算变得容易得多。
至于将机场与时区相匹配
这个过程不能完全自动化,因为所有数据集(甚至商业产品)都有遗漏。即使您购买了商业服务,也会有机场丢失的情况,您必须按城市名称等进行谷歌搜索。例如,如果机场尚未开放,但航空公司已开始销售往返该机场的航班,则可能会发生这种情况。
将坐标与时区匹配不是很有帮助。匹配机场代码本身更容易。有几种服务提供 Web 服务或 REST 端点,您可以调用这些服务来请求机场信息。可以理解的是,免费/开源服务不如商业产品可靠。
作为起点,您应该找到一些服务,查询它们以获取您已经拥有的机场并保留信息,并在新机场出现时更新它。不过,预计会花一些时间清理数据。
考虑订阅商业服务 - 他们采用了每次使用模式,如果您只有 5000 个电话要拨打,则成本非常低。它们还提供了很多信息,如坐标、位置、性能信息等。