日期小写转大写的函数

hkstudio 2008-05-10 11:31:05
如何用sql编写的函数实现:日期小写转大写。

如:2008-05-10 贰零零扒 零伍 壹拾

要求:
比如写出来的函数名为date_change();

date_change(2008)返回结果:贰零零扒

date_change(05)返回结果:零伍

date_change(10)返回结果:壹拾


日期格式为:yyyy-mm-dd
...全文
150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloWorld_001 2008-05-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xuangxing 的回复:]
如果用translate函数:
SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual;

转换结果
------------------
贰零零扒-零伍-壹零

这并不是我想要的,我想要的结果为:

贰零零扒-零伍-壹拾

又如:'2008-05-21' 贰零零扒-零伍-贰拾壹
[/Quote]
楼主是猪,还非要人把放你口中
xxx198547 2008-05-14
  • 打赏
  • 举报
回复
加分 加分
bai_jiong 2008-05-12
  • 打赏
  • 举报
回复
试一下这个函数:
create or replace function f_convert_date(ld_date date)
return varchar2
as
li_num integer;
ls_ret varchar2(100);
ls_in_date varchar2(10);
ls_year varchar2(30);
ls_month varchar2(30);
ls_day varchar2(30);
begin
ls_in_date:=to_char(ld_date,'yyyy-mm-dd');
select count(1) into li_num from dual where regexp_like(ls_in_date,'^\d{4}-\d{1,2}-\d{1,2}$','i');
if li_num<>1 then
ls_ret:='invalid date format';
else
ls_year:=substr(ls_in_date,1,4);
ls_month:=substr(ls_in_date,6,2);
ls_day:=substr(ls_in_date,9,2);
ls_year:=translate(ls_year,'0123456789','零壹贰叁肆伍陆柒捌玖');
if substr(ls_month,1,1)='0' then
ls_month:='零'||translate(substr(ls_month,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
else
ls_month:=translate(substr(ls_month,1,1),'0123456789','零壹贰叁肆伍陆柒捌玖')||'拾'||translate(substr(ls_month,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
end if ;
if substr(ls_day,1,1)='0' then
ls_day:='零'||translate(substr(ls_day,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
else
ls_day:=translate(substr(ls_day,1,1),'0123456789','零壹贰叁肆伍陆柒捌玖')||'拾'||translate(substr(ls_day,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
end if ;
ls_ret:=ls_year||'年'||ls_month||'月'||ls_day||'日';
end if ;
return ls_ret;
end ;
ehuman 2008-05-11
  • 打赏
  • 举报
回复
要只是日期字符变化,需求挺奇怪的。
你可以使用以下的程序片段去处理
function date_change(strSrc in varchar2)
is
v_strDesc varchar2(100);
begin
for i in 1..length(strSrc) loop
v_strDesc :=v_strDesc || case substr(strSrc,i,1)
when 1 then 壹
when 2 then 贰
。。。。
else ''
end case;

end loop;
return v_strDesc;
end;

以上代码也许能够你帮助。
hkstudio 2008-05-11
  • 打赏
  • 举报
回复
一至九月要写为:零壹、零贰、零叁、零肆、零伍、
零陆、零柒、零捌、零玖
十至十二月写为:壹拾月、壹拾壹月、壹拾贰月
日子照此办理比如2005年8月3日
应写为:贰零零伍年零捌月零叁日
2005年11月22日
应写为:二零零伍年壹拾壹月贰拾贰日
hkstudio 2008-05-11
  • 打赏
  • 举报
回复
如果用translate函数:
SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual;

转换结果
------------------
贰零零扒-零伍-壹零

这并不是我想要的,我想要的结果为:

贰零零扒-零伍-壹拾

又如:'2008-05-21' 贰零零扒-零伍-贰拾壹
hkstudio 2008-05-11
  • 打赏
  • 举报
回复
create or replace function date_change(strSrc in varchar2) return varchar2 is
v_strDesc varchar2(100);
begin
for i in 1 .. length(strSrc) loop
v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then '壹' when 2 then '贰' when 3 then '叁' when 4 then '肆' when 5 then '伍' when 6 then '陆' when 7 then '柒' when 8 then '扒' when 9 then '玖' else '零' end case;

end loop;
return v_strDesc;
end;


==================
汉字加单引号,还是编译不通过:
Compilation errors for FUNCTION LG.DATE_CHANGE

Error: PLS-00103: 出现符号 "CASE"在需要下列之一时:
* & = - + ; < / > at in is
mod not rem <an exponent (**)> <> or != or ~= >= <= <> and or
like between ||
符号 "CASE" 被忽略。
Line: 5
Text: v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then '壹' when 2 then '贰' when 3 then '叁' when 4 then '肆' when 5 then '伍' when 6 then '陆' when 7 then '柒' when 8 then '扒' when 9 then '玖' else '零' end case;
ehuman 2008-05-11
  • 打赏
  • 举报
回复
when 1 then 壹
汉字应该加单引号。
其实这样的问题使用translate也可以解决,
楼上有人写的就不错。
hkstudio 2008-05-11
  • 打赏
  • 举报
回复
create or replace function date_change(strSrc in varchar2) return varchar2 is
v_strDesc varchar2(100);
begin
for i in 1 .. length(strSrc) loop
v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then 壹 when 2 then 贰 when 3 then 叁 when 4 then 肆 when 5 then 伍 when 6 then 陆 when 7 then 柒 when 8 then 扒 when 9 then 玖 else '零' end case;

end loop;
return v_strDesc;
end;


====================================================
报如下错误:
Compilation errors for FUNCTION LG.DATE_CHANGE

Error: PLS-00103: 出现符号 "CASE"在需要下列之一时:
* & = - + ; < / > at in is
mod not rem <an exponent (**)> <> or != or ~= >= <= <> and or
like between ||
符号 "CASE" 被忽略。
Line: 5
Text: v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then 壹 when 2 then 贰 when 3 then 叁 when 4 then 肆 when 5 then 伍 when 6 then 陆 when 7 then 柒 when 8 then 扒 when 9 then 玖 else '零' end case;

请问哪里出问题了?怎么修改?
cenlmmx 2008-05-11
  • 打赏
  • 举报
回复
SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual;

转换结果
------------------
贰零零扒-零伍-壹零

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧