calcular edad en años, meses y días
Publicado por guillermo arias (10 intervenciones) el 16/02/2007 05:45:05
Estuve tratando de calcular la edad de alguien en años, meses y días pero no me resultaba, bajé varias rutinas de otros programadores y tenían errores, así que les presento una rutina que creo que no tiene fallas. Ojalá les sirva.
*********************************************
clea
tdBirth = {^2006/12/2} -1 && fecha de nacimiento, no olvidar el -1, es importante
tdTarget= {^2007/02/8} && fecha de comparación
Years = 0
Months = 0
Days = 0
Local ldTemp, ldBirth, lnDrop
tdTarget = Iif(Empty(m.tdTarget), Date(), m.tdTarget)
If m.tdBirth > m.tdTarget
ldTemp = m.tdTarget
tdTarget = m.tdBirth
tdBirth = m.ldTemp
Endif
ldBirth = Date(Year(m.tdTarget),Month(m.tdBirth),Day(m.tdBirth))
lnDrop = 0
If Empty(m.ldBirth) && leap case
ldBirth = Date(Year(m.tdTarget),3,1)
lnDrop = Iif(Month(m.tdTarget)<=2,0,1)
Endif
Years = Year(m.tdTarget) - Year(m.tdBirth) - (Iif(m.ldBirth > m.tdTarget,1,0))
Months = (Month(m.tdTarget) - Month(m.tdBirth) + 12 - (Iif(Day(m.tdBirth)>Day(m.tdTarget),1,0)))%12
ldTemp = Date( Year(m.tdBirth) + Years, Month(m.tdBirth), Day(m.tdBirth) )
If Empty(ldTemp)
ldTemp = Date( Year(m.tdBirth) + Years, Month(m.tdBirth), Day(m.tdBirth-1) )
Endif
Days = m.tdTarget - Gomonth(m.ldTemp,Months) - m.lnDrop
* correción de errores
DO case
CASE INLIST(MONTH(tdTarget),1,3,5,7,8,10,12)
IF Days= 31
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
CASE INLIST(MONTH(tdTarget),4,6,9,11)
IF Days= 30
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
OTHERWISE
lAñoBis = (MOD(YEAR(tdTarget),4)=0 AND MOD(YEAR(tdTarget),100)<>0) OR MOD(YEAR(tdTarget),400)=0
IF Days= IIF(lAñoBis,29,28)
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
ENDCASE
?years,months,days
*********************************************
clea
tdBirth = {^2006/12/2} -1 && fecha de nacimiento, no olvidar el -1, es importante
tdTarget= {^2007/02/8} && fecha de comparación
Years = 0
Months = 0
Days = 0
Local ldTemp, ldBirth, lnDrop
tdTarget = Iif(Empty(m.tdTarget), Date(), m.tdTarget)
If m.tdBirth > m.tdTarget
ldTemp = m.tdTarget
tdTarget = m.tdBirth
tdBirth = m.ldTemp
Endif
ldBirth = Date(Year(m.tdTarget),Month(m.tdBirth),Day(m.tdBirth))
lnDrop = 0
If Empty(m.ldBirth) && leap case
ldBirth = Date(Year(m.tdTarget),3,1)
lnDrop = Iif(Month(m.tdTarget)<=2,0,1)
Endif
Years = Year(m.tdTarget) - Year(m.tdBirth) - (Iif(m.ldBirth > m.tdTarget,1,0))
Months = (Month(m.tdTarget) - Month(m.tdBirth) + 12 - (Iif(Day(m.tdBirth)>Day(m.tdTarget),1,0)))%12
ldTemp = Date( Year(m.tdBirth) + Years, Month(m.tdBirth), Day(m.tdBirth) )
If Empty(ldTemp)
ldTemp = Date( Year(m.tdBirth) + Years, Month(m.tdBirth), Day(m.tdBirth-1) )
Endif
Days = m.tdTarget - Gomonth(m.ldTemp,Months) - m.lnDrop
* correción de errores
DO case
CASE INLIST(MONTH(tdTarget),1,3,5,7,8,10,12)
IF Days= 31
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
CASE INLIST(MONTH(tdTarget),4,6,9,11)
IF Days= 30
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
OTHERWISE
lAñoBis = (MOD(YEAR(tdTarget),4)=0 AND MOD(YEAR(tdTarget),100)<>0) OR MOD(YEAR(tdTarget),400)=0
IF Days= IIF(lAñoBis,29,28)
Days=0
Months= Months +1
IF Months = 12
Months= 0
Years= Years +1
ENDIF
ENDIF
ENDCASE
?years,months,days
Valora esta pregunta
0