在 Oracle 中显示与时间戳关联的时区

JJ1*_*180 3 sql oracle

我的 Oracle 表中的 CRT_TSTMMP 字段是时间戳类型字段。

我希望确定与此字段的值关联的时区,因为它没有显示在我的 SQL Developer 客户端中。

从我的研究来看,似乎 to_char() 是不够的,所以我想知道我可以做些什么来在查询中显示这个时区?

Ale*_*ole 9

ATIMESTAMP不包含任何时区信息。文档说“它包含小数秒但没有时区”,但它似乎隐含地与数据库服务器处于同一时区。

您需要您的列是TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE存储和检索链接到该值的时区。

如果您确实有一列属于其中一种类型,那么您可以使用TZR日期格式模型元素(或TZD,TZH和/或TZM):

select to_char(CRT_TMSTMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR') from ...
Run Code Online (Sandbox Code Playgroud)

但是如果你用普通的方式尝试,TIMESTAMP它只会报告服务器时区。(我认为它出错了,但显然不是)。

作为演示:

create table t42 (CRT_TMSTMP timestamp,
  CRT_TMSTMP_TZ timestamp with time zone,
  CRT_TMSTMP_LTZ timestamp with local time zone);

insert into t42 values (current_timestamp,
  current_timestamp at time zone 'AMERICA/NEW_YORK',
  current_timestamp at time zone 'AMERICA/LOS_ANGELES');

select to_char(CRT_TMSTMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR') as ts,
  to_char(CRT_TMSTMP_TZ, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR') as ts_tz,
  to_char(CRT_TMSTMP_LTZ, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR') as ts_ltz
from t42;

TS                                                             TS_TZ                                                          TS_LTZ                                                       
-------------------------------------------------------------- -------------------------------------------------------------- --------------------------------------------------------------
2014-07-17 17:09:36.673 +00:00                                 2014-07-17 12:09:36.673 AMERICA/NEW_YORK                       2014-07-17 17:09:36.673 EUROPE/LONDON                          
Run Code Online (Sandbox Code Playgroud)

SQL小提琴