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