"Timestamp with Time Zone" Oracle 中的类型保留时区格式

"Timestamp with Time Zone" type in Oracle retains timezone format

Oracle 中的

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

  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这一栏;

    > 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这一栏;

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

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

非常有用

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

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.

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

也许当我说时答案更清楚:"Time zone Europe/Zurich is different to time zone +02:00." 目前两者都比 UTC 早 2 小时,在这种情况下它们是相等的。然而在冬季,这将会改变。

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