【问题标题】:Can't convert timestamp to a time zone Asia/Jerusalem无法将时间戳转换为时区亚洲/耶路撒冷
【发布时间】:2017-12-27 08:28:51
【问题描述】:

我正在使用 Oracle,它正在做:

 SELECT FROM_TZ(TIMESTAMP '2017-03-31 02:10:00', 'Asia/Jerusalem') 
   FROM DUAL;

抛出一个:

01878. 00000 -  "specified field not found in datetime or interval"

但我不知道为什么。当天没有时间变化,DST 时间从 2017 年 3 月 24 日开始。有什么想法吗?

【问题讨论】:

  • 你真的是说它崩溃了吗?还是会抛出错误?
  • 是的,它会引发错误,抱歉。我添加了详细信息。
  • 这是特定于 TZR 是耶路撒冷的那一天凌晨 2 点的问题。 TIMESTAMP '2017-03-31 01:59:59'TIMESTAMP '2017-03-31 03:00:00' 一样工作得很好。令人费解
  • TIMESTAMP '2017-03-31 02:10:00' at time zone 'Asia/Jerusalem' 工作
  • @a_horse_with_no_name 这两个不是不同的吗? at time zone 会给我GMT -> LocalFROM_TZ 会给我Local -> GMT

标签: sql oracle timezone timestamp


【解决方案1】:

您的 Oracle 数据库似乎认为 2017 年以色列的春季夏令时过渡是在 3 月 31 日而不是 3 月 24 日。如果时区数据文件尚未更新,则会发生这种情况。

Asia/Jerusalem 区域最后一次修改是在 tzdb 版本 2012h 中,当时相关规则从 this commit 中的 Fri>=26 更改为 Fri>=23。因此,您的数据库中的数据来源于比 2012h 的 tzdb 版本。 2012h announcement 引用了此更改。

Oracle 数据库对其时区文件有自己的版本和版本控制方案,所以我不确定这与哪个 Oracle tz 数据文件版本相关。但是,您应该将时区数据始终更新为最新版本是一种最佳做法。订阅tz announcements mailing list at IANA,然后在每个 tzdb 发布后不久从 Oracle 寻找相应的更新。

有关在 Oracle 中更新时区数据的信息,请查看in the documentation here

(我的理解是,Oracle 时区数据文件本身只能通过具有有效支持合同的 Oracle 获得。)

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2012-09-26
    • 1970-01-01
    • 2020-10-28
    • 2011-05-10
    • 1970-01-01
    • 2013-05-20
    • 2013-06-30
    • 2018-12-18
    相关资源
    最近更新 更多