【问题标题】:"Timestamp with Time Zone" type in Oracle retains timezone formatOracle 中的“Timestamp with Time Zone”类型保留时区格式
【发布时间】:2018-07-19 07:47:27
【问题描述】:

Oracle 中的Timestamp with Time Zone 数据类型有一个奇怪的特性,当我们选择时区时,它会保留插入时区的格式而没有任何格式;

  1. TZR

    UPDATE X SET COLUMN_A = TO_TIMESTAMP_TZ('19-JUL-18 01.53.16.381566000 PM UTC', 
                                            'DD-MON-RR HH.MI.SSXFF AM TZR') ...
    

    如果我直接选择此列;

    > SELECT COLUMN_A WHERE ...
    19-JUL-18 01.53.16.381566000 PM UTC
    
  2. TZH:TZM

    UPDATE X SET COLUMN_A = TO_TIMESTAMP_TZ('19-JUL-18 01.53.16.381566000 PM +00:00', 
                                            'DD-MON-RR HH.MI.SSXFF AM TZH:TZM') ...
    

    如果我直接选择此列;

    > SELECT COLUMN_A WHERE ...
    19-JUL-18 01.53.16.381566000 PM +00:00
    

此功能背后的原因是什么,有没有办法控制这种方式,例如,我可以将所有这些值设置为 TZH:TZM 格式。我不是在谈论特定于会话的NLS_TIMESTAMP_TZ_FORMAT,尽管它对于SELECT 案例非常有用

【问题讨论】:

  • 我认为默认显示格式取决于您用于检索数据的工具。是 SQL*Plus 还是 Toad 还是什么?
  • @Rusty 它是SQL Developer,但我认为您误读了问题,如上所述,生成的格式仅取决于更新中的格式,在同一个工具中,我们得到两个不同的原始结果SELECT

标签: sql oracle formatting timestamp-with-timezone


【解决方案1】:

时区 UTC 与时区 +00:00 不同。你只会得到你之前插入的东西。

当我说“时区Europe/Zurich 与时区+02:00 不同”时,也许答案会更清楚。目前两者都比世界标准时间早 2 小时,这样它们是相等的。但是在冬季,这种情况会有所改变。

UTC+00:00 都没有应用夏令时,所以区别不是那么明显,但在内部它们是不同的。

【讨论】:

    【解决方案2】:

    我遇到了您的问题,但我仍然认为这取决于工具。在我的蟾蜍下面的测试用例返回相同的结果:

    create table test_a(
      id        number,
      column_a timestamp with time zone
    )
    ;
    
    insert into test_a(id) values(1);
    insert into test_a(id) values(2);
    
    update test_a
    SET COLUMN_A = TO_TIMESTAMP_TZ('19-JUL-18 01.53.16.381566000 PM UTC', 
                                       'DD-MON-RR HH.MI.SSXFF AM TZR') 
    where id = 1;                                   
    
    update test_a
     SET COLUMN_A = TO_TIMESTAMP_TZ('19-JUL-18 01.53.16.381566000 PM +00:00', 
                                       'DD-MON-RR HH.MI.SSXFF AM TZH:TZM') 
    where id = 2;                                   
    
    
    select * from test_a;
            ID COLUMN_A                           
    ---------- -----------------------------------
    COLUMN_B                           
    -----------------------------------
             1 2018-07-19 13:53:16.381566 +00:00  
    
    
             2 2018-07-19 13:53:16.381566 +00:00  
    
    
    
    2 rows selected.
    

    【讨论】:

    • 您可以单独选择它们吗?结果一样吗?
    • TOAD 有自己的方法来显示数据值(主要取决于您当前的 Windows 设置),您不应将其用作参考。使用 SQLplus。在来自NLS_TIMESTAMP_TZ_FORMAT 的 SQLplus 值适用
    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2013-07-07
    • 2012-04-04
    • 2020-09-20
    • 2011-05-03
    • 2011-03-14
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多