oracle - 将时间戳转换为带时区的时间戳

标签 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 日期格式。如何指定添加时区?

最佳答案

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

我在英国,所以这对我有用,但如果你的服务器在不同的时区,你可能需要转换它。

关于oracle - 将时间戳转换为带时区的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27785204/

相关文章:

database - Oracle 在两次使用同一列时无法正确排序

database - Oracle XE 11g 找不到 XE 数据库

返回不相交记录的 SQL 语句

oracle - 无法停止/删除 DBMS_SCHEDULER 中的作业

sql - 如何从 Oracle 中的值列表中进行选择

sql - 如何在不区分大小写的 Oracle DB 中返回不同的记录?

java - 获取2个表中的每个最新数据以及其他表中的数据

oracle - 类似结果的 Oracle PARTITION BY 与 GROUP BY 的解释

c# - 将数据从 Oracle Server 复制到 SQL Server

sql - 在 Oracle 中删除多个列