繁体   English   中英

将字符串转换为 oracle sql 时间戳 Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)

[英]convert a string to oracle sql timestamp Mon Aug 19 2019 08:21:48 GMT-0700 (PDT)

问候社区。

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

-感谢您的帮助!

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

输入是带时区的时间戳。 它有关于时区的冗余信息; 其中一些必须被剥离。 例如,如果您选择信任 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(无论如何都不容易),因为必须替换的内容可能包含可变字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM