【问题标题】:Why are Oracle time zones wrong?为什么 Oracle 时区错误?
【发布时间】:2021-09-12 00:54:11
【问题描述】:

为什么 Oracle 的时区错误?芝加哥关了一个小时,丹佛关了一个小时,等等。

Linux 服务器的时间以及 Oracle 的 sessiontimezone 和 dbtimezone 都是正确的。

Oracle 的 current_date 确实与 sysdate 相差一个小时。它们应该是一样的。

SELECT tzabbrev, SUBSTR(tz_offset(tzname), 1, 6), tzname FROM v$timezone_names tz WHERE tzname = 'America/Denver';
LMT -07:00  America/Denver
MST -07:00  America/Denver
MWT -07:00  America/Denver
MDT -07:00  America/Denver

这些都应该是-06:00

【问题讨论】:

    标签: oracle oracle11g timezone timezone-offset


    【解决方案1】:

    夏令时? SessionTimeZone 来自会话设置而不是数据库时区设置。

    【讨论】:

    • 两台服务器确实有不同的 dbtimezones(一个 UTC,一个丹佛时间),但我不明白当下一个夏令时更改是在 11 月时,这将如何影响今天的 UTC 偏移量。伙计,我一般不喜欢时区。
    【解决方案2】:

    它没有:

    ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
    
    SELECT SYSTIMESTAMP AT TIME ZONE 'UTC',
           SYSTIMESTAMP AT TIME ZONE 'America/Denver'
    FROM   DUAL;
    

    输出:

    SYSTIMESTAMPATTIMEZONE'UTC' SYSTIMESTAMPATTIMEZONE'AMERICA/DENVER'
    2021-06-29 22:09:27.786125000 +00:00 2021-06-29 16:09:27.786125000 -06:00

    如果你这样做:

    ALTER SESSION SET TIME_ZONE = 'America/Denver';
    

    然后:

    SELECT SYSTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL;
    

    然后是 dbfiddle 上的输出(在英国,目前在 UTC+1):

    SYSTIMESTAMP CURRENT_TIMESTAMP
    2021-06-29 23:09:27.788275000 +01:00 2021-06-29 16:09:27.788278000 -06:00

    我假设您的服务器时区设置为 UTC-7,您的会话时区设置为美国/丹佛 (UTC-6),并且您使用的是 SYSTIMESTAMP,它获取的是服务器时间而不是会话时间CURRENT_TIMESTAMP 会返回。

    db小提琴here

    【讨论】:

    • 很遗憾没有。两台服务器的时间相同。 $date Tue Jun 29 16:24:40 MDT 2021 Current_date 在两个系统之间有所不同。主要的奇怪之处在于 server2 上的所有时区偏移量都是错误的。
    【解决方案3】:

    如果您仍在使用 11g,则您的数据库版本已过期。

    您可以检查您的时区文件是否过时

    从 v$timezone_file 中选择 *;

    您应该考虑升级,但可能需要在 11g 中清理手册。

    https://oracle-blog.com/upgrade-database-timezone-file-in-oracle-19c-upgrade/

    【讨论】:

    • 同意,我们有一个升级计划,但是这个数据库需要一段时间。
    • 但是,所有其他数据库都有正确的 TZ 偏移量,包括 Oracle 11。即使有最旧的时区文件,美国的每个主要城市(我检查过的)都没有时间偏离仲夏的一个小时。
    【解决方案4】:

    消除“当前”时间或偷偷地在本地替换 TZOFFSET 的任何问题。检查一个应该是 -6:00 的日期和另一个应该是 -7:00 的日期。重复不同年份。我怀疑它不会在 2020 年 3 月 7 日至 8 日或 2021 年 13 日/14 日比赛之间切换。操作系统为 Oracle 提供的时钟时间(例如英国时间而不是 UTC 时间)存在外部可能性

    with
        x as
            (select timestamp '2020-07-01 13:00:00 America/Denver' denver_time
            from dual)
    select to_char(denver_time,'YYYY-MM-DD HH24:MI TZH:TZM') denver_time,
             to_char(denver_time at time zone 'UTC','YYYY-MM-DD HH24:MI TZH:TZM') utc_time,
             to_char(denver_time at time zone dbtimezone,'YYYY-MM-DD HH24:MI TZH:TZM') db_time,
         dbtimezone, sessiontimezone
    from x;
    
    with
        x as
            (select timestamp '2020-03-01 13:00:00 America/Denver' denver_time
            from dual)
    select to_char(denver_time,'YYYY-MM-DD HH24:MI TZH:TZM') denver_time,
             to_char(denver_time at time zone 'UTC','YYYY-MM-DD HH24:MI TZH:TZM') utc_time,
             to_char(denver_time at time zone dbtimezone,'YYYY-MM-DD HH24:MI TZH:TZM') db_time,
             dbtimezone, sessiontimezone
    from x;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2022-06-11
      • 2022-01-04
      • 2019-12-13
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      相关资源
      最近更新 更多