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

时间:2014-07-17 15:41:04

标签: sql oracle

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

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

从我的研究看来,似乎to_char()还不够,所以我想知道如何在查询中显示这个时区?

1 个答案:

答案 0 :(得分:3)

TIMESTAMP不包含任何时区信息。文档说"它包含小数秒但没有时区"但它似乎隐含在与数据库服务器相同的时区。

您需要使用TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE列来存储和检索与该值相关联的时区。

如果您确实拥有其中一种类型的列,则可以使用TZR date format model element(或TZDTZH和/或TZM):

select to_char(CRT_TMSTMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZR') from ...

但如果您使用普通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                          

SQL Fiddle