如何检查给定日期时间的时区?

Dav*_*vio 6 sql-server t-sql datetime

我正在使用的数据库/表将其所有日期值保存为日期时间(没有时区)。

如何找出该日期所在的时区?

例如,中欧夏令时 (+02) 从 2015 年 3 月 29 日开始,而之前的冬季时间 (+01) 从 2014 年 10 月 26 日开始。

假设我看到的日期是2014-11-06,是否有一个函数可以用来检查它属于哪个时区?

注意,我知道时区变化时会有一些边缘情况

如果需要的话,我对一些大的CASE WHEN语句感到满意,但当然更愿意使用一些系统函数。

Sol*_*zky 5

由于时区的性质,这在技术上甚至概念上都不可能。

应当指出的是,时区是不能简单地从UTC / GMT偏移量(即“+”或“ - ”值)。“偏移量”是时区的一个属性,但它不会也不能确定时区,因为:

  • 多个时区可以共享相同的偏移量
  • 时区可以来来去去,甚至可以改变它们的偏移量
  • 不同地区可以更改时区

时区由政府决定。例如,在美国,连续的 48 个州主要有 4 个时区。但是这些相同的偏移量也被其他地区使用,这些地区可能对夏令时开始和结束的时间有不同的法律,或者他们是否有夏令时。事实上,连续的 48 个州有两个额外的时区来处理两个州的差异:一个是印第安纳州,一个是亚利桑那州

夏令时的开始和结束时间会随着时间而变化。上面的印第安纳州和亚利桑那州的链接针对这两个州讨论了这一点。在美国,DST 开始和结束日期在 2007 年发生了变化,但这不会影响使用相同偏移量的其他地区。并且 DST 偏移量并不总是 1 小时(在前面的链接中提到)。

所以,与:

  • 仅 DATETIME 值您没有确定偏移量或时区的基础(即使您有时区数据库)

  • 一个 DATETIME 值和一个 OFFSET——无论是单独存储还是组合在 DATETIMEOFFSET 数据类型中——你有偏移量(显然)但不能确定确切的时区,虽然它可以缩小到几个,但前提是你有一张表其中时区在特定时间参与了该偏移量(有关此类数据的来源,请参见下文)。仅使用偏移量,DATETIME 值可以转换为 UTC,但不能转换为另一个偏移量,除非首先拥有时区数据库并知道您将其转换到哪个特定时区,这将指示该特定时间点的偏移量。(说它不能转换为另一个偏移量,我的意思是以任何有意义的方式;显然偏移量值可以调整,但如果你不知道如何调整它,那没有多大帮助)

  • 一个 DATETIME 值和一个时区(名称),然后您可以通过查找该时间点的偏移量来确定偏移量(有关此类数据的来源,请参见下文)

不幸的是,此时区数据未内置到 SQL Server 中。但是您可以从以下来源(可能还有其他来源)获取它: