如何在Oracle中将yyyymmdd转换为dd-mm-yyyy?

时间:2013-07-31 12:49:22

标签: sql oracle date datetime oracle-sqldeveloper

我有一个列包含varchar2中的日期,格式不同,如19.02.2013,29-03-2013,30 / 2013/2013等。但最烦人的是20130713(2013年7月13日),我想将其转换为dd-mm-yyyy或dd-mon-yyyy。

3 个答案:

答案 0 :(得分:9)

转换为日期,然后格式化为char:

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

给出13 JUL 2013

答案 1 :(得分: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 '%.%'

答案 2 :(得分: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