2017-04-04 22 views
0

我從客戶端獲取數據,其中日期值有時包含額外數字。這裏有幾個例子: 2/13/201733246當日期值後面有額外值時從字符串中提取日期

2/15/20179714

3/7/201712718

這些值加載到一個臨時表作爲一個字符串,但我需要提取日期部分並將其作爲日期加載到最終目標表中。

我曾嘗試使用正則表達式,並可以選擇日期的模式,但我堅持從那裏。我怎樣才能選擇不屬於日期的數值並去除它們?我可以用oracle regexp來做到這一點嗎?

我也嘗試在月份和日期部分添加前導0,並且可以確定何時只是一位數字,但是如何將0與原始數字一起添加?

如果我使用substr,如果月份和日期都是2位數字,但兩者都是單個數字,則失敗。

任何幫助將非常感謝!

+0

的問題是,如果你有一個可以依靠的模式。例如,你是否總是用「/」分隔日,月?總是用四位數字寫年? – Aleksej

+0

是的,日期總是MM/DD/YYYY。不一致的部分是今年之後的比特。也就是說,MM/DD部分可能是1位或2位。 –

回答

3

這可能是一個辦法:

with inputData(str) as (
    select '2/13/201733246' from dual union all 
    select '2/15/20179714' from dual union all 
    select '3/7/201712718' from dual 
) 
select str, regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') 
from inputData 

這可以被重新用不同的,更緊湊,辦法,但我相信這是易於閱讀。

正則表達式看起來是一個或兩個數字([0-9]{1,2})後面跟一個/的序列的兩倍,然後是一年中完全4位數的序列([0-9]{4})

的另一種方式,不使用正則表達式,可能是以下幾點:

substr(str, 1, instr(str, '/', 1, 2) +4) 

這看起來對/的第二個發生,並給出從第一個字符的字符串到第二/加4個字符年。

結果:

SQL> with inputData(str) as (
    2  select '2/13/201733246' from dual union all 
    3  select '2/15/20179714' from dual union all 
    4  select '3/7/201712718' from dual 
    5 ) 
    6 select str, 
    7   regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') str1, 
    8   substr(str, 1, instr(str, '/', 1, 2) +4) str2 
    9 from inputData; 

STR     STR1  STR2 
-------------------- ---------- ---------- 
2/13/201733246  2/13/2017 2/13/2017 
2/15/20179714  2/15/2017 2/15/2017 
3/7/201712718  3/7/2017 3/7/2017 

無論你決定使用,如果你需要得到的結果DATE格式的方式,你必須使用一個to_date上面顯示的字符串轉換結果。

例如, regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') 應該成爲 to_date(regexp_substr(str, '^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}'), 'mm/dd/yyyy')

+0

這是完美的!我使用了你提供的正則表達式,不僅起作用,而且學到了一些可以引導的東西。謝謝! –

+2

由於問題是如何提取DATE,您應該通過TO_DATE來包圍表​​達式,即'TO_DATE(regexp_substr(str,'^ [0-9] {1,2}/[0-9] {1,2}/[0-9] {4}'),'MM/DD/YYYY')'爲了得到一個'DATE'結果。 –

+0

感謝您提及TO_DATE部分。我沒有完全證明我已經完成了這個省略,但是可能會幫助其他人尋求完成這項工作。 –