我有一列包含 varchar2 格式的日期,例如 19.02.2013、29-03-2013、30/12/2013 等。但最烦人的是 20130713(即 2013 年 7 月 13 日),我想将其转换为 dd-mm-yyyy 或 dd-mon-yyyy。
问问题
61072 次
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
于 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 回答