将时间戳转换为时区的时间戳

时间:2015-01-05 18:02:34

标签: oracle oracle11g

我正在尝试将时间戳转换为时区,并添加GMT时区:

to_timestamp(to_char(t.time_started, 'DD-MON-YYYY hh24:mi:ss')
  || nvl2(t.time_started, ' GMT', null), ('DD-MON-YYYY hh24:mi:ss tzd'))

但是这无法识别ORA-01812日期格式。如何指定添加时区?

2 个答案:

答案 0 :(得分:3)

您需要使用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  

我在英国这样对我有用,但如果您的服务器位于不同的时区,则可能需要转换它。

答案 1 :(得分:0)

如果列t.time_started的类型为TIMESTAMP,并且请求是在给定的时区中解释此时间戳,则将在此处使用函数FROM_TZ

相反,AT TIME ZONE子句用于将TIMESTAMP WITH TIME ZONE值从一个时区移动到另一个时区。

这意味着,通过下面的SELECT语句,首先将TIMESTAMP值隐式转换(使用当前会话时区)到TIMESTAMP WITH TIME ZONE值,然后将该值显示在另一个时区,可能不是预期的结果和问题的解决方案。

select t.time_started at time zone 'GMT' from t

请参见以下示例,其中显示了不同之处。 (我的会话时区当前为+2:00)。

CREATE TABLE t
(
   time_started    TIMESTAMP
);

INSERT INTO t
     VALUES (CURRENT_TIMESTAMP);

SELECT * FROM t;


SELECT FROM_TZ(t.time_started, 'GMT') as T1, t.time_started AT TIME ZONE 'GMT' as T2 FROM t

结果是:

+-----------------------------------+-----------------------------------+
|                T1                 |                T2                 |
+-----------------------------------+-----------------------------------+
| 2019-07-16 12:17:29,068660 +00:00 | 2019-07-16 10:17:29,068660 +00:00 |
+-----------------------------------+-----------------------------------+

两个值都显示在GMT中,但明显不同。