代码之家  ›  专栏  ›  技术社区  ›  tobyc

带有时区名称zone vs offset的Oracle时间戳

  •  7
  • tobyc  · 技术社区  · 17 年前

    在oracle中,是否始终存储命名时区?

    我已经在我们的系统中测试了本专栏,在某些地方,时间戳显示为:

    26-FEB-09 11.36.25.390713 AM +13:00
    

    但其他时候:

    26-FEB-09 11.36.25.390713 AM Pacific/Auckland
    

    如果将该值存储为前者,是否意味着未存储实际时区?

    我担心,因为如果将来的日期只存储了一个偏移量,我们可能无法确定原始时区中的实际时间,因为您可以确定与时区的偏移量,但反之亦然。

    谢谢

    2 回复  |  直到 17 年前
        1
  •  11
  •   Mark Brady Mark Brady    17 年前

    这很容易测试

     create table foo ( tswtz TIMESTAMP WITH TIME ZONE);
        /
    
    insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 -5:00', 'DD-MON-YYYY HH24:MI:SS TZH:TZM'));
    
    
    insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 EST', 'DD-MON-YYYY HH24:MI:SS TZR'));
        select tswtz, extract(timezone_abbr from tswtz), extract(TIMEZONE_REGION from tswtz)
    from foo;
    
    
    TSWTZ         EXTRACT(TIMEZONE_ABBRFROMTSWTZ) EXTRACT(TIMEZONE_REGIONFROMTSWTZ)                                
    ------------- ------------------------------- ---------------------------------------------------------------- 
    21-FEB-09 06.00.00.000000000 PM -05:00   UNK                          UNKNOWN                                                          
    21-FEB-09 06.00.00.000000000 PM EST      EST                             EST                                                              
    
    2 rows selected
    

        2
  •  2
  •   tobyc    17 年前

    我发现打开连接时在ODP.NET中设置时区和格式似乎可以解决这个问题:

    OracleGlobalization info = conn.GetSessionInfo();
    info.TimeZone = "Pacific/Auckland";
    info.TimeStampFormat = "DD-MON-YYYY HH:MI:SS.FF AM";
    info.TimeStampTZFormat = "DD-MON-YYYY HH:MI:SS.FF AM TZR";
    conn.SetSessionInfo(info);