将字符串转换为oracle sql timestamp 2019年8月19日星期一08:21:48 GMT-0700(PDT)

时间:2020-02-13 21:19:25

标签: sql oracle timestamp

问候社区。

我在Java中看到了类似的示例,但是我们如何在SQL(特别是Oracle)中做到这一点。 现在,我只是这样做,因为我们处于PDT时区。

-Thx寻求帮助!

with xx as ( 
select replace('Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)',' GMT-0700 (PDT)','') as dt from dual

)

select to_date(dt,'DY MON DD YYYY HH24:MI:SS') from xx

1 个答案:

答案 0 :(得分:2)

输入是带有时区的时间戳。它具有有关时区的冗余信息;其中一些必须去除。例如,如果您选择信任PDT而忽略GMT偏移,则可以执行以下操作:

with xx as ( 
select regexp_replace('Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)','GMT-\d{4} \(|\)') 
       as str_ts_with_tz 
from   dual
)
select to_timestamp_tz(str_ts_with_tz,'Dy Mon DD YYYY HH24:MI:SS TZD') 
       as oracle_ts_with_tz 
from   xx
;



ORACLE_TS_WITH_TZ                      
---------------------------------------
2019-08-19 08:21:48 America/Los_Angeles

请注意,结果数据类型为时间戳记带时区。如果需要,您可以进一步将其转换为时间戳或日期(仅丢弃时区信息)。这是Oracle内部的简单操作。但是丢失信息;在这样做之前请三思。

还请注意,与您的输入相比,时间戳在我的输出中以不同的格式显示。这是因为我的NLS_TIMESTAMP_TZ_FORMAT'yyyy-mm-dd hh24:mi:ss tzr'

如果您想知道为什么必须针对时区信息做出选择(那么,这意味着“为什么需要首先删除部分输入字符串”):PDT与GMT-0700根本不同。可能是夏天,而不是冬天。 Oracle不会接受这种自相矛盾的废话作为其功能的输入。是GMT-0700还是PDT,不能两者兼有。而且,您不能只使用REPLACE(无论如何都不容易),因为必须替换的内容中可能包含可变字符。