我的Oracle表中的CRT_TMSTMP字段是时间戳类型字段。
我希望确定与此字段值相关的时区,因为它不会显示在我的SQL Developer客户端中。
从我的研究看来,似乎to_char()还不够,所以我想知道如何在查询中显示这个时区?
答案 0 :(得分:3)
TIMESTAMP
不包含任何时区信息。文档说"它包含小数秒但没有时区"但它似乎隐含在与数据库服务器相同的时区。
您需要使用TIMESTAMP WITH TIME ZONE
或TIMESTAMP WITH LOCAL TIME ZONE
列来存储和检索与该值相关联的时区。
如果您确实拥有其中一种类型的列,则可以使用TZR
date format model element(或TZD
,TZH
和/或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