pl/sql實現34進制轉換-爱代码爱编程
有一個小需求,需要實現日期相減,然後把數據轉化為34進制,為此我準備兩個函數
date_trans函數負責日期相加減,並調用進制轉換函數
create or replace function date_trans2(v_days varchar)
return varchar2
is
v_day number;
v_str varchar2(10);
begin
select ceil(to_date(v_days ,'yyyy/mm/dd')- to_date('1970/01/01','yyyy/mm/dd') ) into v_day from dual;
select convert_decimal_to_base34(v_day) into v_str from dual;
return v_str;
end date_trans2;
convert_decimal_to_base34函數負責進制轉換
CREATE OR REPLACE function convert_decimal_to_base34(p_decimal_num number)
return varchar2 is
v_Result_str varchar2(7);
v_replace_str varchar2(1);
v_baseIndex int := 6;
v_remainder int := 0;
v_quotient int := p_decimal_num;
begin
---------Initial string--------
v_Result_str := '';
loop
v_remainder := mod(v_quotient, 34);
------------replace decimal_num with base 34 code
select decode(v_remainder,
'10',
'A',
'11',
'B',
'12',
'C',
'13',
'D',
'14',
'E',
'15',
'F',
'16',
'G',
'17',
'H',
'18',
'I',
'19',
'J',
'20',
'K',
'21',
'L',
'22',
'M',
'23',
'N',
'24',
'O',
'25',
'P',
'26',
'Q',
'27',
'R',
'28',
'S',
'29',
'T',
'30',
'U',
'31',
'V',
'32',
'W',
'33',
'X',
v_remainder)
into v_replace_str
from dual;
v_result_str := v_replace_str || v_result_str;
--------------
if v_remainder!=0 then
v_quotient := floor(v_quotient / 34);
end if;
--v_baseIndex := v_baseIndex - 1;
exit when v_quotient <= 0;
----------Do while conditional loop ----------
end loop;
return(v_Result_str);
end convert_decimal_to_base34;
進行進制轉換結果正確