您需要使用the to_timestamp_tz() function,而不仅仅是to_timestamp; 'tzd' 格式元素无法识别,因此您的错误:
select to_timestamp_tz(to_char(t.time_started, 'DD-MON-YYYY hh24:mi:ss')
|| nvl2(t.time_started, ' GMT', null), ('DD-MON-YYYY hh24:mi:ss tzd'))
from t;
TO_TIMESTAMP_TZ(TO_CHAR(T.TIME_STARTED,'DD-MON-YYYYHH24:MI:SS')||NVL2(T.TIME_STARTED,'GMT',NULL),('DD-MON-YYYYHH24:MI:SSTZD'))
------------------------------------------------------------------------------------------------------------------------------
05-JAN-15 18.09.28.000000000 EUROPE/LONDON
您会注意到,您选择的格式模型会丢失小数秒。
您还可以使用the at time zone expression 指定一个值所代表的时区:
select t.time_started at time zone 'GMT' from t;
T.TIME_STARTEDATTIMEZONE'GMT'
-----------------------------------
05-JAN-15 18.12.53.419495000 GMT
或者您可以使用cast,正如您的问题标题所建议的那样,我相信这是假设系统时区:
select cast(t.time_started as timestamp with time zone) from t;
CAST(T.TIME_STARTEDASTIMESTAMPWITHTIMEZONE)
-------------------------------------------
05-JAN-15 18.14.19.236338000 EUROPE/LONDON
我在英国,所以这对我有用,但如果您的服务器位于不同的时区,您可能需要对其进行转换。