dt9 & dt10
23 Novembre 2008 , Rédigé par Milan Publié dans #Sql
// Deux fonctions qui permettent de transformer une pseudo date en vraie date.
// Dans DB2 LUW une fonction, qui utilise alors le “SQL inline”, ne peut utiliser de Handler, c'est la raison pour laquelle DT10 appelle la procédure DT10A, qui elle, a accès à toutes les instructions SQL PL.
// Les choses sont plus simples sur AS400 où une telle gymnastique n'est pas nécessaire...
Bravo le i !
values dt9(991124)#
values dt9(19991225)#
values dt10('1987-12-25')#
values dt10(dt9(19980513))#
values dt10(dt9(380722))#
values dt10(dt9(701133))#
****************************
create function dt9
-- une pseudo date 6 ou 8 numérique amj ou samj
(zn dec(8, 0))
-- une pseudo date alpha formatée iso avec séparateur
-- (qui peut être vérifiée
-- et transformée en vrai date par dt10)
returns varchar(10)
language sql
a010: begin atomic
declare za char(8);
declare aan decimal(4, 0);
declare aa char(4);
declare mm char(2);
declare jj char(2);
-- l'année
set aan = zn/10000;
-- s'il s'agit d'une date sur 6, complément 19 ou 20.
if aan <= 99 then
if aan > 40 then
set aan=aan+1900;
else
set aan=aan+2000;
end if;
end if;
set aa = digits(aan);
--dans une zone alpha pour extraction
set za = digits(zn);
-- le mois
set mm = substr(za, 5, 2);
-- le jour
set jj = substr(za, 7, 2);
-- assemblage final
return aa concat '-' concat mm concat '-' concat jj;
end #
****************************
create function dt10
-- une pseudo date alpha avec séparateur
(za10 varchar(10))
-- une vraie date, ou null si la date passée est incorrecte.
returns date
aa: begin atomic
declare madate date;
call dt10a(za10, madate);
return madate;
end #
create procedure dt10a(in za10 varchar(10), out madate date)
reads sql data
language sql
a010: begin
declare errw int default 0;
declare continue handler for sqlexception set errw=1;
set madate = cast(za10 as date);
if errw =0 then return;
else
set madate = null;
return errw;
end if;
end #
/image%2F1025633%2F20151122%2Fob_b0e74c_pam007i.png)