【问题标题】:Oracle TIMESTAMP WITH TIMEZONE named zone vs offsetOracle TIMESTAMP WITH TIMEZONE 命名区域与偏移量
【发布时间】:2010-10-09 22:51:06
【问题描述】:

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

我一直在我们的系统中测试这个列,并且在某些地方时间戳显示为:

26-FEB-09 11.36.25.390713 AM +13:00

但其他时候是:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland

如果该值被存储为前者,这是否意味着实际时区没有被存储?

我担心,因为如果未来日期仅存储一个偏移量,我们可能无法确定原始时区的实际时间,因为您可以确定与时区的偏移量,但反之则不行。

谢谢

【问题讨论】:

    标签: oracle datetime timezone timestamp dst


    【解决方案1】:

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

    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);
    

    【讨论】:

      【解决方案2】:

      很容易测试

       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
      

      它存储您告诉它的内容。如果你告诉它一个偏移量,那么这个偏移量可能对一个或多个时区都有好处,那么它为什么只选择一个呢?

      【讨论】:

      • 好的,很酷,这就是我所期望的。所以说我有一个“创建”列,我想拥有当前时间戳的默认值。目前在我的数据库中,对 systimestamp 的调用会返回一个带有偏移量的时间戳。如何更改它以使用命名时区?谢谢
      • 哇... Oracle 返回您告诉它返回的内容。任何默认行为都是默认行为。永远不要依赖默认值,始终是明确的。而且我认为 systimestamp 没有,但选择 to_char(systimestamp, 'YYYYMMDD HH24:MI:SS.FF TZR') || ' ' ||双重意志的 SESSIONTIMEZONE。
      • 从未知的双重结果中选择提取(TIMEZONE_REGION from systimestamp)
      • 选择 to_char(systimestamp, 'YYYYMMDD HH24:MI:SS.FF TZR') || ' ' ||来自双重的 SESSIONTIMEZONE;结果:20090226 13:34:05.481439 +13:00 +11:00 为什么 SESSIONTIMEZONE 11?以及如何使 TZR 格式返回命名的时区。干杯
      • 这可能是 NLS 设置。我稍后会尝试找到它
      猜你喜欢
      • 2012-06-21
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2023-01-10
      • 2012-03-02
      • 2012-07-09
      • 2019-01-28
      相关资源
      最近更新 更多