在长文本中以正常日期显示朱利安日期

时间:2015-01-15 06:13:41

标签: regex oracle oracle-sqldeveloper

我有一个很长的文字,如"acbshdh2015128dfg2015009;jsg2015070"。它包含一些Julian日期,例如"2015128""2015009""2015070"。我想在这篇长文"acbshdh05082015dfg01092015;jsg03112015"中将它们显示为普通日期。 我想通过Oracle SQL实现它。有什么建议吗?

我做的就像

REGEXP_REPLACE( ColumnName, '[[:digit:]]{10}', to_char(to_date(to_number(REGEXP_SUBSTR(ColumnName,'[[:digit:]]{10}')),J),'MM/DD‌​/YYYY HH:MI:SS') ) 

然而,结果是错误的。

1 个答案:

答案 0 :(得分:1)

你确定表达朱利安日期(你的意思是“正常”日期)? 请查看维基百科:Julian day

我认为你不能在纯SQL中做到这一点,你必须编写这样的PL / SQL函数:

CREATE OR REPLACE FUNCTION ConvertJulianDate(str IN VARCHAR2) RETURN VARCHAR2 IS
    res VARCHAR2(1000) := str;  
BEGIN
    FOR i IN 1..REGEXP_COUNT(str, '\d+') LOOP
        res := REGEXP_REPLACE(res, '\d+', TO_CHAR(TO_DATE(REGEXP_SUBSTR(str, '\d+', 1, i), 'J'), 'mmddyyyy'), 1, i);
    END LOOP;
    RETURN res;
END;

SELECT ConvertJulianDate('acbshdh2015128dfg2015009;jsg2015070') FROM dual;

acbshdh02130805dfg10170804;jsg12170804

只是为了澄清:朱利安日期 2015128表示0805-02-13(为了避免任何混淆而提及:13th of February 805 A.D.