【问题标题】:Daylight Saving time from DB2DB2 的夏令时
【发布时间】:2014-11-06 09:23:07
【问题描述】:

我如何知道运行 DB2 的服务器是否配置了 DST?

CURRENT TIMEZONE 特殊寄存器为我提供了 UTC 和时间戳之间的差异,但这种差异可能会改变(夏季/冬季)。最后,我不确定服务器配置在哪个时区。

假设巴黎是格林威治标准时间 +1。夏季,CURRENT TIMEZONE 是 20000,因为 DST 处于活动状态,这意味着 2 小时。在冬季,当前时区指示 10000,这与 +1 GMT 完全对应。

我想检索当前时区的名称,我可以通过将时区的名称和值(存储在表中或函数内)与 CURRENT TIMEZONE 寄存器和 DST 进行匹配来实现

但是我怎样才能得到夏令时呢?

【问题讨论】:

  • DB2 实例从操作系统获取时间和地区信息,包括夏令时状态,因此您基本上需要知道实例进程的TZ 环境变量的值。
  • 但是如何从 DB2 获得?我正在考虑一个外部例程。
  • 如果服务器的 DBA 没有提供功能,我怀疑您必须创建一个。您是否有可以讨论的特定用例?客户端和服务器之间的关系似乎是相关的。
  • 外部例程可能是要走的路。这是一篇描述相关问题的旧文章,也许您可​​以从中得出一些结论:http://www.ibm.com/developerworks/data/library/techarticle/dm-0407munteanu/
  • ...这是一个常见的建议是让数据库(可能还有整个服务器)使用 UTC/GMT 的原因之一 - 没有 DST,没有偏移,没有奇怪的天数,纳达。 “本地时间”通常是记录事件的显示/呈现问题(当使用时间戳时),而不是域问题。此外,它还让您免于头疼 - 在更改后到 DST 发生时间进行任何翻译都是可怕的,您必须在规则更改发生时存储,并对存储的值执行数学运算。在传入参数上执行它并使用索引要好得多。

标签: datetime timezone db2 dst datetimeoffset


【解决方案1】:

你说:

我想检索当前时区的名称,我可以通过将时区的名称和值(存储在表中或函数内)与 CURRENT TIMEZONE 寄存器和 DST 进行匹配来实现。

这是不正确的。任何具有映射到时区名称或标识符的时区偏移量的列表都必然充满错误,即使它具有是否支持 DST 的标志。

问题在于许多不同的时区使用相同的偏移量并使用 DST,但在不同的日期和/或不同的时间进入和退出 DST。时区也会对其遵循的偏移量(例如Samoa did in 2011)或DST 何时开始和停止(例如the USA did in 2007)的规则进行更改。在某些情况下,DST 可以永久设置为开启或关闭(例如俄罗斯 did in 2011 并且正在撤消 this year)。

如果您只是想知道您的数据库服务器运行的时区是否在 DST - 您可以检查 1 月 1 日和 7 月 1 日的 UTC 偏移量。如果它们相同,则时区不使用 DST。如果它们不同,则检查当前时间的偏移量并查看它与哪个对齐。如果是较大的偏移量,则 DST 有效。如果是较小的偏移量,则 DST 无效。

免责声明:我假设 DB2 具有获取特定日期偏移量的功能。我没有验证这一点,对 DB2 本身知之甚少。

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 2013-02-18
    • 2011-02-22
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2017-07-11
    相关资源
    最近更新 更多