2016-04-18 13 views
0

に値をフォーマットし、私のDateTimeとしてフォーマット値を取得するには、Oracleに次のコードを持っている:オラクルREGEXは時間

AGD_STARTTIME列は、それのデータは、この形式で保存された
E.EVE_START_DATE || ' ' || LPAD(NVL(TRIM(SUBSTR(AGD_START_TIME, 0, LENGTH(AGD_START_TIME)-2)), '00') || ':' || NVL(SUBSTR(AGD_START_TIME, -2), '00') || ':00', 8, '0') EVE_START_DATE 

930 
1330 
1630 
1730 

私はこれをRegexを使って書き直そうとしていますが、問題はあります。

E.EVE_START_DATE || ' ' || regexp_replace('0'||AGD_START_TIME,'.*([0-9]{2})([0-9]{2})$','\1:\2:00') EVE_START_DATE 

しかし、私はこの返されたデータで終わっているのですが、なぜ930のエントリだけがうんざりするのですか?

08-JUN-16 16:30:00 
05-OCT-16 0 930 
05-OCT-16 13:30:00 
22-JUN-16 16:30:00 
13-JUL-16 0 930 
13-JUL-16 13:30:00 
10-AUG-16 16:30:00 
18-MAY-16 13:30:00 
21-SEP-16 13:30:00 
02-NOV-16 17:30:00 
22-JUN-16 16:30:00 
22-JUN-16 13:30:00 
14-SEP-16 0 930 
12-OCT-16 17:30:00 
20-OCT-16 17:30:00 
10-AUG-16 13:30:00 
+0

「930」はスペースと数字で始まりながら、あなたの正規表現は、その後、2桁、2桁の数字を探しますので。 – mustaccio

+0

さて、修正は何ですか? – MB34

+1

Uhm ...スペースや数字を探す? – mustaccio

答えて

0

あなたは95%と思っています。

930の前に余分なスペースがあります。 TRIM()それを解決する必要があります!

E.EVE_START_DATE || ' ' || regexp_replace('0'||TRIM(AGD_START_TIME),'.*([0-9]{2})([0-9]{2})$','\1:\2:00') EVE_START_DATE 

サンプル:

SQL> with my_data(AGD_START_TIME) as 
    2 (
    3 select ' 930' from dual 
    4 union all 
    5 select '1330' from dual 
    6 union all 
    7 select '1630' from dual 
    8 union all 
    select '1730' from dual 
    9 10 ) 
11 select regexp_replace('0'||TRIM(AGD_START_TIME),'.*([0-9]{2})([0-9]{2})$','\1:\2:00') as str 
from my_data; 12 

STR 
-------------------------------------------------------------------------------- 
09:30:00 
13:30:00 
16:30:00 
17:30:00 
+0

@mustaccioが欠場しました。 – MB34

+0

スペースをトリムしても正規表現が正しくないために失敗する – rock321987

+0

いいえ、最後の4桁を探します。そして、左にパディング '0'は '930'を' 0930'にします –