问候社区。 p>
我在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
答案 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(无论如何都不容易),因为必须替换的内容中可能包含可变字符。