Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/04/2013, 11:06
Avatar de jolie_girl
jolie_girl
 
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 8 meses
Puntos: 10
Respuesta: Solucion a llamar funcion como alias en clausula where

Usa mas tu imaginación gnsoloyo, mi pregunta fue demasiado simple otravez, pero bueno si me quieres ayudar mucho mas te dare toda mi información , aver si puedes solucionarlo de una mejor manera,:

La siguiente función que puse hasta abajo me trae el pagosiguiente de cada registro , cada registro solo tiene
la fecha inicial de pago (fecha), la variable :actual la puse para simular varios dias del año "actuales" pero realmente ahi va curdate(), y la formapago puede ser trimestral, mensual o semestral.


Ejemplo: Si tengo como fecha: 2010-04-01 y en pago trimestral, el siguiente pago seria 2013-04-01 pero como ya pasó (actualmente estamos a 4 de abril del 2013) el siguiente pago seria el 2013-07-01.., si le pongo fecha actual nose por ejm 2013-07-02, la que me debe sacar es 2013-10-01


Teniendo ese problema ya resuelto con la función que obviamente puedo reducirla en algunos puntos, no en todos, pero bueno asi la deje para seguir probando todo lo demas que me falta...


Ahora tengo 2 problemas extras es cuando ya estoy manipulando la tabla , quiero que me traiga las que vencen en una semana ( ya esto es aparte) , en 15 dias, 1 mes, etc, ejemplo:

select campo, siguientepago(campo,curdate(),campo) from polizas
where day(siguientepago(campo,curdate(),campo)) < day(curdate()+7)
and month(siguientepago(campo,curdate(),campo)) = month(curdate())


eso esta mall aparte incompleto pero bueno.........porque suponiendo que me trae un dia 30 de marzo pues le sumara 7 y dara 37, pero esto lo hice porque antes tenia:


select siguientepago(campo,curdate(),campo) from polizas where
siguientepago(campo,curdate(),campo) < date_add(curdate, interval 7 day)
and siguientepago(campo,curdate(),campo) < curdate()


pero tampoco esta bien ya que muchas fechas iniciales son de 2007, años anteriores
al 2013 y esto solo funciona con 2013, requiero solamente sumar los dias
que del 31 o 30 del mes si sumo 7 no me de 38 ni 37

¿SE PUEDE HACER ESO ? sumar solo dias y no el año ........?


esa seria la pregunta en la que me quede, cada consulta esta limitada por el paginador a 30 registros por lo que no se hace nada lenta asi como la estoy usando

-----------------------------------------------------------------------------------------------




DELIMITER $$

DROP FUNCTION IF EXISTS `basededatos`.`tabla`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `siguientepago`(fecha date, actual date, formapago varchar(50)) RETURNS varchar(20) CHARSET latin1
BEGIN

declare trimestreactual int(1);
declare mesfecha int(2);
declare messig int(2);
declare messig2 varchar(12);
declare dia varchar(2);
declare salida VARCHAR(12);
declare mesactual int(2);
declare mes varchar(2);



set mesactual = month(actual);
set mesfecha = month(fecha);

If(day(fecha)<10) then set dia = concat('0',day(fecha));
else set dia = day(fecha);
end if;


if(formapago="Semestral") then

set salida = date_add(fecha, interval 6 month);

If(month(salida)<10) then set mes = concat('0',month(salida));
else set mes = month(salida);
end if;

set salida = concat(year(actual),'-',mes,"-",dia);

end if;


if(formapago="Mensual") then

set salida = date_add(fecha, interval 1 month);

If(month(salida)<10) then set mes = concat('0',month(salida));
else set mes = month(salida);
end if;

set salida = concat(year(actual),'-',mes,"-",dia);

end if;

if(formapago="ContadoAnual") then

set salida = date_add(fecha, interval 12 month);

If(month(salida)<10) then set mes = concat('0',month(salida));
else set mes = month(salida);
end if;

set salida = concat(year(actual),'-',mes,"-",dia);

end if;


if(formapago ="Trimestral")then






case mesfecha
when 1 then if (mesactual <= 3) then set messig = 4; end if;
if (mesactual >= 4 && mesactual <=6) then set messig = 7; end if;
if (mesactual >= 7 && mesactual <=9) then set messig = 10; end if;
if (mesactual >=10 && mesactual <=12) then set messig = 1; end if;


when 2 then if (mesactual <= 4 ) then set messig = 5; end if;
if (mesactual >= 5 && mesactual <=7) then set messig = 8; end if;
if (mesactual >= 8 && mesactual <=10) then set messig = 11; end if;
if (mesactual = 11 || mesactual = 12 || mesactual = 1 ) then set messig = 2; end if;


when 3 then if (mesactual <= 5 ) then set messig = 6; end if;
if (mesactual >= 6 && mesactual <=8) then set messig = 9; end if;
if (mesactual >= 9 && mesactual <=11) then set messig = 12; end if;
if (mesactual = 12 || mesactual = 1 || mesactual = 2 ) then set messig = 3; end if;


when 4 then if (mesactual <= 6 ) then set messig = 7; end if;
if (mesactual >= 7 && mesactual <=9) then set messig = 10; end if;
if (mesactual >= 10 && mesactual <=12) then set messig = 1; end if;
if (mesactual = 1 || mesactual = 2 || mesactual = 3 ) then set messig = 4; end if;


when 5 then if (mesactual <= 7 ) then set messig = 8; end if;
if (mesactual >= 8 && mesactual <=10) then set messig = 11; end if;
if (mesactual >= 11 && mesactual <=1) then set messig = 2; end if;
if (mesactual = 2 || mesactual = 3 || mesactual = 4 ) then set messig = 5; end if;


when 6 then if (mesactual <= 8 ) then set messig = 9; end if;
if (mesactual >= 9 && mesactual <=11) then set messig = 12; end if;
if (mesactual >= 12 && mesactual <=2) then set messig = 3; end if;
if (mesactual = 3 || mesactual = 4 || mesactual = 5 ) then set messig = 6; end if;


when 7 then if (mesactual <= 9 ) then set messig = 10; end if;
if (mesactual >= 10 && mesactual <=12) then set messig = 1; end if;
if (mesactual >= 1 && mesactual <=3) then set messig = 4; end if;
if (mesactual = 4 || mesactual = 5 || mesactual = 6 ) then set messig = 7; end if;



when 8 then if (mesactual <= 10 ) then set messig = 11; end if;
if (mesactual >= 11 && mesactual <=1) then set messig = 2; end if;
if (mesactual >= 2 && mesactual <=4) then set messig = 5; end if;
if (mesactual = 5 || mesactual = 6 || mesactual = 7 ) then set messig = 8; end if;

when 9 then if (mesactual <= 11 ) then set messig = 12; end if;
if (mesactual >= 12 && mesactual <=2) then set messig = 3; end if;
if (mesactual >= 3 && mesactual <=5) then set messig = 6; end if;
if (mesactual = 6 || mesactual = 7 || mesactual = 8 ) then set messig = 9; end if;


when 10 then if (mesactual <= 12 ) then set messig = 1; end if;
if (mesactual >= 1 && mesactual <=3) then set messig = 4; end if;
if (mesactual >= 4 && mesactual <=6) then set messig = 7; end if;
if (mesactual = 7 || mesactual = 8 || mesactual = 9 ) then set messig = 10; end if;


when 11 then if (mesactual <= 1 ) then set messig = 2; end if;
if (mesactual >= 2 && mesactual <=4) then set messig = 5; end if;
if (mesactual >= 5 && mesactual <=7) then set messig = 8; end if;
if (mesactual = 8 || mesactual = 9 || mesactual = 10) then set messig = 11; end if;

when 12 then if (mesactual <= 2 ) then set messig = 3; end if;
if (mesactual >= 3 && mesactual <=5) then set messig = 6; end if;
if (mesactual >= 6 && mesactual <=8) then set messig = 9; end if;
if (mesactual = 9 || mesactual = 10 || mesactual = 11) then set messig = 12; end if;





end case;





if(mesactual - mesfecha = 3) then
if( day(actual) < day(fecha)) then
set messig = mesfecha +3;
end if;
end if;




if(mesactual<10) then set messig2 = concat('0',messig);
else set messig2 = messig;
end if;

set salida = CONCAT(year(actual),'-',messig2,'-',dia);

end if;



return salida;

END$$

DELIMITER ;
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp