* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* F U N C I O N: Tiempo(<fFechaIni> [, <fFechaFin>] [, <nRegresa>] [, cSeparador]) -> cTiempo
* DESCRIPCION : Investiga los Años, Meses y Días transcurridos desde la fecha <fFechaIni> y la fecha <fFechaFin>
* PARAMETROS : <fFechaIni> -> Primera fecha a tratar.
* <fFechaFin> -> Segunda Fecha a tratar. Si se omite este parámetro, se tomará la fecha actual con DATE().
* <nRegresa> -> Indica que tipo de dato se está solicitando:
* 1 = Años
* 2 = Años y Meses
* 3 = Años, Meses y Días
* <cSeparador> -> Caracter a utilizar como separador entre los Años, Meses y Días. Por default será: '.'
* R E G R E S A: <cTiempo> -> Cadena de caracteres con los Años, Meses y Días transcurridos
* desde la fecha <fFechaIni> hasta la fecha <fFechaFin>
* E J E M P L O: ? Tiempo( CTOD('17/07/1971'), CTOD('06/07/2001'), 1) ) -> '29' // Años
* ? Tiempo( CTOD('23/03/1972'), CTOD('06/07/2001'), 2) ) -> '29.3' // Años.Meses
* ? Tiempo( CTOD('03/04/1960'), CTOD('06/07/2001'), 3) ) -> '41.3.3' // Años.Meses.Días
*
FUNCTION Tiempo(fFechaIni, fFechaFin, nRegresa, cSeparador)
LOCAL cAnos, cMese, cDias, cTiempo
LOCAL nAnos, nMese, nDias, nDiaUltimo, fAux , aa,mm
DEFAULT fFechaFin := DATE()
DEFAULT nRegresa := 1
DEFAULT cSeparador:= '.'
If EMPTY(fFechaIni)
RETURN('')
EndIf
nDias := fFechaFin - fFechaIni
// AÑOS...
nAnos := INT(nDias / 365)
// MESES...
fAux := CTOD( STR(DAY(fFechaIni)) + '/' + STR(MONTH(fFechaIni)) + '/' + STR(YEAR(fFechaFin) - 1,4))
nMese := INT((fFechaFin - fAux) / 30.42)
nMese := IF(nMese >= 12, nMese - 12, nMese)
// DIAS...
mm := If(MONTH(fFechaFin) - 1 < 1 , 12 , MONTH(fFechaFin) - 1 )
aa := If(MONTH(fFechaFin) - 1 < 1 , YEAR(fFechaFin)-1 , YEAR(fFechaFin) )
fAux := CTOD( STR(DAY(fFechaIni)) + '/' + ; // Dia de Fecha DESDE
STRzero(mm,2) + '/' + ; // Mes de Fecha HASTA - 1
STR(aa, 4)) // Año de Fecha HASTA
* fAux := CTOD( STR(DAY(fFechaIni)) + '/' + ; // Dia de Fecha DESDE
* STR(MONTH(fFechaFin) - 1) + '/' + ; // Mes de Fecha HASTA - 1
* STR(YEAR(fFechaFin), 4)) // Año de Fecha HASTA
nDias := fFechaFin - fAux // Fecha HASTA -
nDiaUltimo := DAY( DiaUltimo(fAux) )
nDias := IF(nDias >= nDiaUltimo, nDias - nDiaUltimo, nDias)
cAnos := if( nAnos>0 , alltrim( STR(nAnos) )+ ' años' , '')
cMese := if( nMese>0 , alltrim( STR(nMese) )+ ' mes'+if(nMese>1,'es','') , '')
cDias := if( nDias>0 , alltrim( STR(nDias) )+ ' dia'+if(nDias>1,'s','') , '')
DO CASE
CASE nRegresa = 1
cTiempo := cAnos
CASE nRegresa = 2
cTiempo := cAnos + If(nAnos>0,cSeparador,'') + cMese
CASE nRegresa = 3
cTiempo := cAnos + If(nAnos>0,cSeparador,'') +;
cMese + If(nMese>0,cSeparador,'') + cDias
ENDCASE
RETURN(cTiempo)
*
* FIN Tiempo()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* FUNCION : DiaUltimo( <fFecha> ) -> fFecha.
* DESCRIPCION: Sirve para averiguar el dia ultimo del mes de una fecha cualquiera.
* PARAMETROS : <fFecha>. Es la fecha que se va a tratar. Por defecto, es la fecha
* del sistema.
* REGRESA : <fFecha>. Es la fecha que corresponde al dia ultimo del mes de la
* fecha mandada como parámetro.
*
FUNCTION DiaUltimo(fFecha)
LOCAL fFechaAux // Fecha con el día primero del mes mandado en fFecha.
LOCAL nMes, nAno
If VALTYPE(fFecha) <> 'D'
fFecha := DATE()
EndIf
// Se calcula el día primero del mes siguiente de la fecha pasada.
nMes := IF(MONTH(fFecha) = 12, 1, MONTH(fFecha) + 1)
nAno := YEAR(fFecha) + IF(nMes = 1, 1, 0)
fFechaAux := CTOD('01/' + alltrim( STR(nMes) ) + '/' +;
alltrim( STR(nAno) ))
RETURN fFechaAux-1 // Al dia primero del mes siguiente se le resta un dia.
*
* FIN DiaUltimo()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *