ORACLE feed regexp匹配功能

时间:2014-05-26 14:45:30

标签: regex oracle date-arithmetic

如何将函数应用于正则表达式匹配?

我的目标是:将文本字段中的所有unis时间戳转换为人类可读的日期时间

可以通过

提取Unixtimestamp
regexp (\d{10}' || chr(4) ||')

所以现在我有了

SELECT 
   HISTODETAILS,
   regexp_replace(HISTODETAILS,'(\d{10}' || chr(4) ||')','\1')  HISTODETAILS2
FROM <table>
WHERE .....

我想将一个函数应用于\1

SELECT 
   HISTODETAILS,
   regexp_replace(HISTODETAILS,'(\d{10}' || chr(4) ||')',myfunction('\1'))  HISTODETAILS2
FROM <table>
WHERE .....

首先,你认为这可以做到吗? 应该是这样的......怎么样? :)

TIA

编辑: 我应该提到时间戳可能会多次出现 即。

1398929938
this and that , bla bla bla

1400587008
more bla bla bla

1400587395
once more bla bla bla

,最终结果应为

2014-05-01 09:38:58
this and that , bla bla bla

2014-05-20 13:56:48
more bla bla bla

2014-05-20 14:03:15
once more bla bla bla

2 个答案:

答案 0 :(得分:0)

unix时间戳只是自unix时代以来的秒数(有时是毫秒,但你的是10位数,所以是秒)。因此,在使用正则表达式提取unix时间戳后,我们可以使用这样的简单日期算法将它们转换为常规日期:

select date '1970-01-01' 
       + to_number(
                regexp_replace(HISTODETAILS, '(\d{10})' || chr(4), '\1')
                  ) /86400) 
from your_table
/

要获得您想要的格式,您需要应用适当的掩码,例如

alter session set nls_date_format = 'yyyy-dd-mm hh24:mi:ss'
/

答案 1 :(得分:-1)

如果您打算使用函数创建值,我会将regexp_replace也放在该函数中。

select histodetails, myfunction(histodetails) 
from   table
where  ...

和功能

create or replace myfunction(p_histodetails)
return varchar2
as
  v_value varchar2(30); -- or whatever
begin
  -- create stuff to replace with
  v_value := '' -- TODO
  -- return the regexp
  return regexp_replace(p_histodetails,'(\d{10}' || chr(4) ||')', v_value)
end
相关问题