0

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

4

3 回答 3

10

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

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

13 JUL 2013.

于 2013-07-31T12:57:57.437 回答
3

如果列包含所有这些不同的格式,您将需要处理每一种格式。假设您的问题包括所有已知格式,那么您有几个选择。

您可以使用 to_char/to_date。这很危险,因为如果源数据不是有效日期,您将收到 SQL 错误(当然,收到错误可能比显示错误数据更可取)。

或者您可以简单地根据格式重新排列字符串中的字符。这实现起来稍微简单一些,并且不关心分隔符是什么。

方法一:

   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')

方法二:

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在这里

于 2013-07-31T13:53:22.240 回答
3

关于数据类型的评论虽然真实,但对您当前的问题没有多大帮助。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 '%.%'
于 2013-07-31T12:59:05.727 回答