2013-07-31 77 views
0

我有一列包含日期varchar2與不同的格式,如19.02.2013,29-03-2013,30/12/2013等。但最令人討厭的是20130713(2013年7月13日),我想將其轉換爲dd-mm-yyyy或dd-mon-yyyy。如何在Oracle中將yyyymmdd轉換爲dd-mm-yyyy?

+5

這應該教你絕不會存儲在日期VARCHAR列。 –

+1

實際上'yyyyMMdd'在某些方面比其他方式更好,因爲它自然排序......但是,您應該使用適當的數據類型開始。 –

回答

2

如果該列包含所有這些各種格式,則需要處理每一種格式。假設你的問題包括全部已知格式,那麼你有幾個選項。

您可以使用to_char/to_date。這很危險,因爲如果源數據不是有效的日期,你會得到一個SQL錯誤(當然,獲取錯誤可能比呈現錯誤數據更好)。

或者您可以根據格式簡單地重新排列字符串中的字符。這實現起來有點簡單,並且不在乎分隔符是什麼。

方法1:

case when substr(tempdt,3,1)='.' 
     then to_char(to_date(tempdt,'dd.mm.yyyy'),'dd-mm-yyyy') 
     when substr(tempdt,3,1)='-' 
     then tempdt 
     when length(tempdt)=8 
     then to_char(to_date(tempdt,'yyyymmdd'),'dd-mm-yyyy') 
     when substr(tempdt,3,1)='/' 
     then to_char(to_date(tempdt,'dd/mm/yyyy'),'dd-mm-yyyy') 

方法2:

case when length(tempdt)=8 
    then substr(tempdt,7,2) || '-' || substr(tempdt,5,2) || '-' || substr(tempdt,1,4) 
    when length(tempdt)=10 
    then substr(tempdt,1,2) || '-' || substr(tempdt,4,2) || '-' || substr(tempdt,7,4) 
end 

SQLFiddle here

+0

謝謝,方法2幫助我解決了類似的問題! – bawpie

8

轉換爲日期,然後格式字符:

select to_char(to_date('20130713', 'yyyymmdd'), 'dd MON yyyy') from dual; 

13 JUL 2013

3

關於數據類型的註釋雖然爲true,但對於解決當前問題並沒有多大幫助。 to_date和to_char的組合可能會起作用。

update yourtable 
set yourfield = to_char(to_date(yourfield, 'yyyymmdd'), 'dd-mm-yyyy') 
where length(yourfield) = 8 
and yourfield not like '%-%' 
and yourfield not like '%.%' 
相關問題