Busqueda entre dos edades

74 views
Skip to first unread message

Sergio Cisak

unread,
Jul 25, 2014, 11:31:21 AM7/25/14
to publice...@googlegroups.com
Buenas, mi consulta es la siguiente. Tengo una tabla con datos de personas cargadas, y uno de esos datos es la "Fecha de nacimiento". Yo en la pantalla de busqueda tengo dos controles "Spinner", uno para elegir la edad minima y el otro para la edad maxima. Cuando selecciono los dos valores, deberia hacer click en Buscar y en la grilla deberian aparecer las personas con la edad comprendida entre esos dos valores. Lo que no se es como hace para calcular la edad para cada registro con la Fecha de nacimiento, y filtrarlos. Ayuda por favor!

mapner

unread,
Jul 25, 2014, 11:48:16 AM7/25/14
to publice...@googlegroups.com
Sergio,

En realidad lo podrías plantear al revés, dada una edad mínima y otra máxima calcular en forma interna las fechas de nacimiento que se corresponden con esas edades y luego hacer el Query o filtro con la fecha de nacimiento de los individuos buscados con un operador BETWEEN


m.nEdadMin = 10
m.nEdadMax = 30

m.dFechaMin = BuscarFechaNac(m.nEdadMin,DATE())
m.dFechaMax = BuscarFechaNac(m.nEdadMax,DATE())

*  si la tabla o cursor es local
select * from personas where fecha_nacimiento BETWEEN m.dFechaMin and m.dFechaMax

*  si la tabla es remota
nCon = SQLSTRINGCONNECT(...)
nRet = SQLExec(nCon,'select * from personas where fecha_nacimiento BETWEEN ?m.dFechaMin and ?m.dFechaMax,'_qry')
...

* la función BuscarFechaNac la dejo para algún colega con tiempo y ganas (sería la inversa de CalculaEdad)

saludos

Víctor Hugo Espínola Domínguez

unread,
Jul 25, 2014, 12:47:20 PM7/25/14
to publice...@googlegroups.com
Hola Sergio

Ve si te sirve el siguiente código, donde se aplica la lógica expuesta por Mapner.

Local ldFecNacMax, ldFecNacMin, lnEdadMax, lnEdadMin

lnEdadMin = 20

lnEdadMax = 30

ldFecNacMin = Edad2FecNac(m.lnEdadMax)

ldFecNacMax = Edad2FecNac(m.lnEdadMin)

Messagebox( Textmerge( "Nacidos entre <<DTOC(ldFecNacMin)>> y <<DTOC(ldFecNacMax)>>"))

Function Edad2FecNac( tnEdad As Integer) As Date

Return (Gomonth(Date(), -1 * m.tnEdad * 12))

Saludos,
Víctor.
Lambaré - Paraguay.

mapner

unread,
Jul 25, 2014, 1:19:07 PM7/25/14
to publice...@googlegroups.com
Victor,

esta muy bien, pero una persona tiene una edad determinada hasta el día anterior a su cumpleaños...

Tu fórmula quizá funcionaría así

Gomonth(Date(), -1 * m.tnEdad * 12)-364 

(o 365 si al año actual es biciesto...)

saludos

Víctor Hugo Espínola Domínguez

unread,
Jul 25, 2014, 2:29:20 PM7/25/14
to publice...@googlegroups.com
Hola Mapner

Tienes razón, la función Edad2FecNac(tnEdad) calcula la fecha de nacimiento de las personas que hoy cumplen tnEdad años.

El código debería quedar así:

Local ldFecNacMax, ldFecNacMin, lnEdadMax, lnEdadMin

lnEdadMin = 20

lnEdadMax = 30

ldFecNacMin = Edad2FecNac(m.lnEdadMax + 1) + 1

ldFecNacMax = Edad2FecNac(m.lnEdadMin)

Messagebox( Textmerge( "Nacidos entre <<DTOC(ldFecNacMin)>> y <<DTOC(ldFecNacMax)>>"))

Function Edad2FecNac( tnEdad As Integer) As Date

Return (Gomonth(Date(), -1 * m.tnEdad * 12))

Saludos,
Víctor.
Lambaré - Paraguay.

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

unread,
Jul 25, 2014, 2:57:26 PM7/25/14
to publice...@googlegroups.com
Tu base de datos esta en tabla DBF o en un motor de base de datos yo lo tengo de esta manera en SQL Server 2012 
CREATE FUNCTION [dbo].[CalEdad] 
(
@dFechNac date
)
RETURNS Int 
AS
BEGIN
DECLARE @nEdad Int 
SET @nEdad = DATEDIFF(year,@dFechNac,GETDATE() ) +    
case 
when (MONTH(GETDATE()) < MONTH(@dFechNac) Or 
(MONTH(GETDATE()) = MONTH(@dFechNac) And 
DAY(GETDATE()) < DAY(@dFechNac))) Then -1 else 0 end

RETURN @nEdad
END

Select FechNac, Edad  from ( Select fechaNac, dbo.CalEdad(fechaNac) as Edad From tuTabla)Teda Where Between edaini and edafin


Saludos; 


Ing. Russvell Jesus Soto Gamarra 
Framework Multi-conexion v6.0 trabaja cualquier base de datos
(SQLServer, MySQL, Firebird, MariaDB, PostgreSQL, Oracle y etc.) 

Reply all
Reply to author
Forward
0 new messages