Manejo de cadenas, la funcion repeat permite repetir un patron varias veces, la funcion lpad, rellena un numero de caracteres al lado izquierdo de una cadena, la funcion rpad, rellena un numero de caracteres al lado derecho de una cadena
Por ejemplo:
repeat("x", 5) --> "xxxxx"
lpad("hola", 6, "x") --> "xxhola"
lpad("hola", 4, "x") --> "hola"
rpad("hola", 6, "x") --> "holaxx"
rpad("1.5", 4, "0") --> "1.50"
JAVA
public String repeat (String pattern, int tamano){
if(pattern==null)return null;
if(tamano<1) return "";
String cadena="";
for(int i=0;i<tamano;i++){
cadena+=pattern;
}
return cadena;
}
public String lpad (String cadena, int tamano, String pattern){
if(cadena==null)return null;
if(pattern==null)return null;
return repeat(pattern,tamano-cadena.length())+cadena;
}
public String rpad (String cadena, int tamano, String pattern){
if(cadena==null)return null;
if(pattern==null)return null;
return cadena+repeat(pattern,tamano-cadena.length());
}
sábado, 10 de enero de 2009
Devuelve la fecha de hoy
Obtener la fecha de hoy en formato DD/MM/YYYY
JAVA
public String hoy(){
Date dFecha_actual = new Date();
String sDia = Integer.toString(dFecha_actual.getDate());
String sMes = Integer.toString(dFecha_actual.getMonth() + 1);
String sAnio = Integer.toString(dFecha_actual.getYear() + 1900);
if(sDia.length() == 1) sDia = "0" + sDia;
if(sMes.length() == 1) sMes = "0" + sMes;
String sFecha = sDia + "/" + sMes + "/" + sAnio;
return sFecha;
}
JAVA
public String hoy(){
Date dFecha_actual = new Date();
String sDia = Integer.toString(dFecha_actual.getDate());
String sMes = Integer.toString(dFecha_actual.getMonth() + 1);
String sAnio = Integer.toString(dFecha_actual.getYear() + 1900);
if(sDia.length() == 1) sDia = "0" + sDia;
if(sMes.length() == 1) sMes = "0" + sMes;
String sFecha = sDia + "/" + sMes + "/" + sAnio;
return sFecha;
}
mes a literal
Convierte un mes a literal es decir en palabras 1 -->ENERO
JAVA
public String mes2literal(int m){
String sMes="";
switch (m){
case 1:
sMes="ENERO";
break;
case 2:
sMes="FEBRERO";
break;
case 3:
sMes="MARZO";
break;
case 4:
sMes="ABRIL";
break;
case 5:
sMes="MAYO";
break;
case 6:
sMes="JUNIO";
break;
case 7:
sMes="JULIO";
break;
case 8:
sMes="AGOSTO";
break;
case 9:
sMes="SEPTIEMBRE";
break;
case 10:
sMes="OCTUBRE";
break;
case 11:
sMes="NOVIEMBRE";
break;
case 12:
sMes="DICIEMBRE";
break;
}
return sMes;
}
JAVA
public String mes2literal(int m){
String sMes="";
switch (m){
case 1:
sMes="ENERO";
break;
case 2:
sMes="FEBRERO";
break;
case 3:
sMes="MARZO";
break;
case 4:
sMes="ABRIL";
break;
case 5:
sMes="MAYO";
break;
case 6:
sMes="JUNIO";
break;
case 7:
sMes="JULIO";
break;
case 8:
sMes="AGOSTO";
break;
case 9:
sMes="SEPTIEMBRE";
break;
case 10:
sMes="OCTUBRE";
break;
case 11:
sMes="NOVIEMBRE";
break;
case 12:
sMes="DICIEMBRE";
break;
}
return sMes;
}
numero a literal
Muchas veces se necesita presentar un numero en forma literal es decir en palabras, a continuacion se presenta una funcion que realiza la conversion de un numero entero a palabras 1000 --> "un mil"
POSTGRES SQL
create or replace function numero2literal(_num text) returns text as $$
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
_literal text;
_numero text;
begin
_numero:=ltrim(_num,'0');
_numero:=replace(_numero,',','');
if length(_numero)=1 then
SELECT CASE
WHEN _numero=0 THEN 'cero'
WHEN _numero=1 THEN 'un'
WHEN _numero=2 THEN 'dos'
WHEN _numero=3 THEN 'tres'
WHEN _numero=4 THEN 'cuatro'
WHEN _numero=5 THEN 'cinco'
WHEN _numero=6 THEN 'seis'
WHEN _numero=7 THEN 'siete'
WHEN _numero=8 THEN 'ocho'
WHEN _numero=9 THEN 'nueve'
ELSE ''
END INTO _literal;
end if;
if length(_numero)=2 then
SELECT CASE
WHEN substring(_numero,1,1)=1 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'diez'
WHEN substring(_numero,2,1)=1 THEN 'once'
WHEN substring(_numero,2,1)=2 THEN 'doce'
WHEN substring(_numero,2,1)=3 THEN 'trece'
WHEN substring(_numero,2,1)=4 THEN 'catorce'
WHEN substring(_numero,2,1)=5 THEN 'quince'
WHEN substring(_numero,2,1) between 6 and 9 THEN 'diez y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=2 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'veinte'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'veinte y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=3 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'treinta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'treinta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=4 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'cuarenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'cuarenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=5 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'cincuenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'cincuenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=6 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'sesenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'sesenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=7 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'setenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'setenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=8 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'ochenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'ochenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=9 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'noventa'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'noventa y ' || numero2literal(substring(_numero,2,1))
END
ELSE ''
END INTO _literal;
end if;
if length(_numero)=3 then
SELECT CASE
WHEN substring(_numero,1,1)=1 THEN CASE
WHEN substring(_numero,2,2)='00' THEN 'cien'
WHEN substring(_numero,2,2)<>'00' THEN 'ciento ' || numero2literal(substring(_numero,2,2))
END
WHEN substring(_numero,1,1) between 2 and 8 THEN CASE
WHEN substring(_numero,2,2)='00' THEN numero2literal(substring(_numero,1,1)) || 'cientos'
WHEN substring(_numero,2,2)<>'00' THEN numero2literal(substring(_numero,1,1)) || 'cientos ' || numero2literal(substring(_numero,2,2))
END
WHEN substring(_numero,1,1) = 9 THEN CASE
WHEN substring(_numero,2,2)='00' THEN 'novecientos'
WHEN substring(_numero,2,2)<>'00' THEN 'novecientos ' || numero2literal(substring(_numero,2,2))
END
ELSE ''
END INTO _literal;
end if;
if length(_numero) between 4 and 6 then
SELECT numero2literal(substring(_numero,1,length(_numero)-3)) || ' mil' ||
CASE WHEN substring(_numero, length(_numero)-2,3)='000' THEN ''
ELSE ' ' || numero2literal(substring(_numero, length(_numero)-2,3))
END
INTO _literal;
end if;
if length(_numero) between 7 and 12 then
SELECT numero2literal(substring(_numero,1,length(_numero)-6)) ||
CASE WHEN substring(_numero,1,length(_numero)-6) ='1' THEN ' millon'
ELSE ' millones'
END
||
CASE WHEN substring(_numero, length(_numero)-5,6)='000000' THEN ''
ELSE ' ' || numero2literal(substring(_numero, length(_numero)-5,6))
END
INTO _literal;
end if;
return _literal;
end;
$$ language plpgsql;
select numero2literal('999999999999');
Resultado:
"novecientos noventa y nueve mil novecientos noventa y nueve millones novecientos noventa y nueve mil novecientos noventa y nueve"
POSTGRES SQL
create or replace function numero2literal(_num text) returns text as $$
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
_literal text;
_numero text;
begin
_numero:=ltrim(_num,'0');
_numero:=replace(_numero,',','');
if length(_numero)=1 then
SELECT CASE
WHEN _numero=0 THEN 'cero'
WHEN _numero=1 THEN 'un'
WHEN _numero=2 THEN 'dos'
WHEN _numero=3 THEN 'tres'
WHEN _numero=4 THEN 'cuatro'
WHEN _numero=5 THEN 'cinco'
WHEN _numero=6 THEN 'seis'
WHEN _numero=7 THEN 'siete'
WHEN _numero=8 THEN 'ocho'
WHEN _numero=9 THEN 'nueve'
ELSE ''
END INTO _literal;
end if;
if length(_numero)=2 then
SELECT CASE
WHEN substring(_numero,1,1)=1 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'diez'
WHEN substring(_numero,2,1)=1 THEN 'once'
WHEN substring(_numero,2,1)=2 THEN 'doce'
WHEN substring(_numero,2,1)=3 THEN 'trece'
WHEN substring(_numero,2,1)=4 THEN 'catorce'
WHEN substring(_numero,2,1)=5 THEN 'quince'
WHEN substring(_numero,2,1) between 6 and 9 THEN 'diez y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=2 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'veinte'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'veinte y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=3 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'treinta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'treinta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=4 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'cuarenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'cuarenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=5 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'cincuenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'cincuenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=6 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'sesenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'sesenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=7 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'setenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'setenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=8 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'ochenta'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'ochenta y ' || numero2literal(substring(_numero,2,1))
END
WHEN substring(_numero,1,1)=9 THEN CASE
WHEN substring(_numero,2,1)=0 THEN 'noventa'
WHEN substring(_numero,2,1) between 1 and 9 THEN 'noventa y ' || numero2literal(substring(_numero,2,1))
END
ELSE ''
END INTO _literal;
end if;
if length(_numero)=3 then
SELECT CASE
WHEN substring(_numero,1,1)=1 THEN CASE
WHEN substring(_numero,2,2)='00' THEN 'cien'
WHEN substring(_numero,2,2)<>'00' THEN 'ciento ' || numero2literal(substring(_numero,2,2))
END
WHEN substring(_numero,1,1) between 2 and 8 THEN CASE
WHEN substring(_numero,2,2)='00' THEN numero2literal(substring(_numero,1,1)) || 'cientos'
WHEN substring(_numero,2,2)<>'00' THEN numero2literal(substring(_numero,1,1)) || 'cientos ' || numero2literal(substring(_numero,2,2))
END
WHEN substring(_numero,1,1) = 9 THEN CASE
WHEN substring(_numero,2,2)='00' THEN 'novecientos'
WHEN substring(_numero,2,2)<>'00' THEN 'novecientos ' || numero2literal(substring(_numero,2,2))
END
ELSE ''
END INTO _literal;
end if;
if length(_numero) between 4 and 6 then
SELECT numero2literal(substring(_numero,1,length(_numero)-3)) || ' mil' ||
CASE WHEN substring(_numero, length(_numero)-2,3)='000' THEN ''
ELSE ' ' || numero2literal(substring(_numero, length(_numero)-2,3))
END
INTO _literal;
end if;
if length(_numero) between 7 and 12 then
SELECT numero2literal(substring(_numero,1,length(_numero)-6)) ||
CASE WHEN substring(_numero,1,length(_numero)-6) ='1' THEN ' millon'
ELSE ' millones'
END
||
CASE WHEN substring(_numero, length(_numero)-5,6)='000000' THEN ''
ELSE ' ' || numero2literal(substring(_numero, length(_numero)-5,6))
END
INTO _literal;
end if;
return _literal;
end;
$$ language plpgsql;
select numero2literal('999999999999');
Resultado:
"novecientos noventa y nueve mil novecientos noventa y nueve millones novecientos noventa y nueve mil novecientos noventa y nueve"
fecha a literal (texto)
Muchas veces se necesita presentar una fecha en forma literal es decir en palabras, a veces con o sin el dia, a continuacion se presenta una funcion que realiza la conversion de una fecha YYYY-MM-DD a palabras nombre_dia dia de mes de año
POSTGRES SQL
CREATE OR REPLACE FUNCTION _fecha_literal(_fecha date, _dia integer) RETURNS text AS $$
-- _dia =0/1 sin/con el dia de la semana
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
_salida text;
begin
SELECT
CASE WHEN _dia=1 THEN
CASE WHEN rtrim(to_char(_fecha, 'day'))='sunday' THEN 'domingo '
WHEN rtrim(to_char(_fecha, 'day'))='monday' THEN 'lunes '
WHEN rtrim(to_char(_fecha, 'day'))='tuesday' THEN 'martes '
WHEN rtrim(to_char(_fecha, 'day'))='wednesday' THEN 'miercoles '
WHEN rtrim(to_char(_fecha, 'day'))='thursday' THEN 'jueves '
WHEN rtrim(to_char(_fecha, 'day'))='friday' THEN 'viernes '
WHEN rtrim(to_char(_fecha, 'day'))='saturday' THEN 'sabado '
ELSE ''
END
ELSE ''
END
||
extract(day from _fecha) || ' de ' ||
CASE WHEN extract(month from _fecha) =01 THEN 'enero'
WHEN extract(month from _fecha) =02 THEN 'febrero'
WHEN extract(month from _fecha) =03 THEN 'marzo'
WHEN extract(month from _fecha) =04 THEN 'abril'
WHEN extract(month from _fecha) =05 THEN 'mayo'
WHEN extract(month from _fecha) =06 THEN 'junio'
WHEN extract(month from _fecha) =07 THEN 'julio'
WHEN extract(month from _fecha) =08 THEN 'agosto'
WHEN extract(month from _fecha) =09 THEN 'septiembre'
WHEN extract(month from _fecha) =10 THEN 'octubre'
WHEN extract(month from _fecha) =11 THEN 'noviembre'
WHEN extract(month from _fecha) =12 THEN 'diciembre'
END
|| ' de ' || extract(year from _fecha)
INTO _salida;
return _salida;
end; $$ LANGUAGE plpgsql;
SELECT _fecha_literal('2007-12-10'::date, 1);
Resultado:
lunes 10 de diciembre de 2007
POSTGRES SQL
CREATE OR REPLACE FUNCTION _fecha_literal(_fecha date, _dia integer) RETURNS text AS $$
-- _dia =0/1 sin/con el dia de la semana
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
_salida text;
begin
SELECT
CASE WHEN _dia=1 THEN
CASE WHEN rtrim(to_char(_fecha, 'day'))='sunday' THEN 'domingo '
WHEN rtrim(to_char(_fecha, 'day'))='monday' THEN 'lunes '
WHEN rtrim(to_char(_fecha, 'day'))='tuesday' THEN 'martes '
WHEN rtrim(to_char(_fecha, 'day'))='wednesday' THEN 'miercoles '
WHEN rtrim(to_char(_fecha, 'day'))='thursday' THEN 'jueves '
WHEN rtrim(to_char(_fecha, 'day'))='friday' THEN 'viernes '
WHEN rtrim(to_char(_fecha, 'day'))='saturday' THEN 'sabado '
ELSE ''
END
ELSE ''
END
||
extract(day from _fecha) || ' de ' ||
CASE WHEN extract(month from _fecha) =01 THEN 'enero'
WHEN extract(month from _fecha) =02 THEN 'febrero'
WHEN extract(month from _fecha) =03 THEN 'marzo'
WHEN extract(month from _fecha) =04 THEN 'abril'
WHEN extract(month from _fecha) =05 THEN 'mayo'
WHEN extract(month from _fecha) =06 THEN 'junio'
WHEN extract(month from _fecha) =07 THEN 'julio'
WHEN extract(month from _fecha) =08 THEN 'agosto'
WHEN extract(month from _fecha) =09 THEN 'septiembre'
WHEN extract(month from _fecha) =10 THEN 'octubre'
WHEN extract(month from _fecha) =11 THEN 'noviembre'
WHEN extract(month from _fecha) =12 THEN 'diciembre'
END
|| ' de ' || extract(year from _fecha)
INTO _salida;
return _salida;
end; $$ LANGUAGE plpgsql;
SELECT _fecha_literal('2007-12-10'::date, 1);
Resultado:
lunes 10 de diciembre de 2007
Listar las hojas de un arbol a partir de un nodo
Si tengo una tabla arbol y deseo listar solo los nodos hojas a partir de un nodo raiz, puedo utilizar la funcion que presento a continuacion, si se selecciona un nodo hoja, se mostrara a si mismo, pero no se mostraran nodos padres
POSTGRES SQL
CREATE OR REPLACE FUNCTION listar_hijos(_tabla text, _id_campo text
, _id_padre text, _id integer, _where text) RETURNS text AS $$
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
_sql text;
_bucle record;
_i integer;
_ids text;
begin
_sql := '
SELECT a.' || _id_campo || ' as id FROM '|| _tabla ||' a, '|| _tabla ||' b
WHERE a.'|| _id_padre ||' = b.'|| _id_campo ||'
AND b.' || _id_campo || ' = ' || _id
|| _where;
raise notice 'sql:%',_sql;
_i:=0;
_ids := '';
for _bucle in
execute _sql
loop
_i:=_i+1;
if (_id <> _bucle.id) then
_ids := _ids || (SELECT * FROM listar_hijos(_tabla, _id_campo
, _id_padre, _bucle.id, _where));
end if;
end loop;
if (_i = 0) then -- comentar el if si se desea que se incluyan los padres
_ids := _ids || ',' || _id;
end if;
return _ids;
end;
$$ LANGUAGE 'plpgsql' VOLATILE;
--ejemplo con WHERE:
--SELECT listar_hijos('tabla', 'id_campo', 'id_campo_padre', 1, ' AND a.campo=''Luis'' ');
SELECT listar_hijos('tabla', 'id_campo', 'id_campo_padre', 1, ' ');
Resultado:
,4,8,9,6,7
Listar los padres de una hoja en un arbol
En un tabla arbol, si tengo el identificador de una hoja(9) y quiero listar los padres de esta(5,2,1) hasta llegar a la raiz del arbol, puedo utilizar la funcion que muestro a continuacion, esta funcion es util para realizar consolidaciones(sumas de datos de hojas a los padres).
si tenemos la siguiente tabla:
POSTGRES SQL
create table tabla(
id_campo serial primary key,
id_campo_padre integer references tabla (id_campo),
hoja boolean default true,
codigo_campo text,
campo text,
nivel integer
);
create or replace function reporte_padres(_tabla text, _id_campo text
, _id_padre text, _codigo text, _campo text, _id integer)
returns setof record as $$
----------------------------
-- Autor: Luis A. Jordan P.
----------------------------
declare
_sql text;
_bucle record;
_bucle1 record;
_bucle2 record;
begin
_sql := '
SELECT ' || _id_campo || '::integer as id_campo
, ' || _id_padre || '::integer as id_padre, ' ||
_codigo || '::text as codigo, ' || _campo || '::text as campo
, nivel::integer FROM ' || _tabla || ' WHERE ' || _id_campo || ' = ' || _id ;
if _sql is null then
raise exception 'Se coloco un nulo al formar el arbol de padres:
SELECT %::integer as id_campo, %::integer as id_padre, %::text as codigo
, %::text as campo, nivel::integer FROM % WHERE % = %
',_id_campo,_id_padre,_codigo,_campo,_tabla,_id_campo,_id;
end if;
for _bucle in
execute _sql
loop
if(_bucle.id_padre<>_bucle.id_campo) then
for _bucle1 in
SELECT * FROM reporte_padres(_tabla, _id_campo
, _id_padre, _codigo, _campo, _bucle.id_padre)
as (id_campo integer, id_padre integer, codigo text
, campo text, nivel integer) ORDER BY codigo
loop
return next _bucle1;
end loop;
end if;
return next _bucle;
end loop;
return ;
end;
$$ language plpgsql;
SELECT * FROM reporte_padres('tabla','id_campo', 'id_campo_padre'
, 'codigo', 'campo', 10)
AS (id_campo integer, id_padre integer, codigo text, campo text, nivel integer);
Suscribirse a:
Entradas (Atom)