Años - meses - dias entre dos fechas

Años - meses - dias entre dos fechas

Postby dobfivewin » Sun Jul 27, 2008 9:20 pm

Amigos...

Hay alguna funcion que me devuelva entre dos fecha la cantidad de AÑOS/MESES/DIAS ?

Chas gracias

dbarrio
Argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina

Postby Willi Quintana » Sun Jul 27, 2008 10:26 pm

Holas,, esta funcion la halle por algun lado,, esta hecha para fox... con un par de retoques zas... funciona para harbour.
Salu2


*-----------------------------------------------------
* FUNCTION Dif_AMD(tdIni, tdFin)
*-----------------------------------------------------
* Calcula la diferencia entre dos fechas en:
* años, meses y días
* Usa la función DiasDelMes()
*-----------------------------------------------------
FUNCTION Dif_AMD(tdIni, tdFin)
LOCAL ldAux, lnAnio, lnMes, lnDia, lcRet
*--- Fecha inicial siempre menor
IF tdIni>tdFin
ldAux = tdIni
tdIni = tdFin
tdFin = ldAux
ENDIF
lnAnio = YEAR(tdFin) - YEAR(tdIni)
ldAux = GOMONTH(tdIni, 12 * lnAnio)
*--- No cumplio el año aun
IF ldAux > tdFin
lnAnio = lnAnio - 1
ENDIF
lnMes = MONTH(tdFin) - MONTH(tdIni)
IF lnMes < 0
lnMes = lnMes + 12
ENDIF
lnDia = DAY(tdFin) - DAY(tdIni)
IF lnDia < 0
lnDia = lnDia + DiasDelMes(tdIni)
ENDIF
*--- Si el dia es mayor, no cumplio el mes
IF (DAY(tdFin) < DAY(tdIni))
IF lnMes = 0
lnMes = 11
ELSE
lnMes = lnMes - 1
ENDIF
ENDIF
lcRet = ALLTRIM(STR(lnAnio))+ " AÑOS, " + ;
ALLTRIM(STR(lnMes))+ " MESES Y " + ;
ALLTRIM(STR(lnDia))+ " DIAS."
RETURN lcRet
ENDFUNC
*-----------------------------------------------------
* FUNCTION DiasDelMes(dFecha)
*------------------------------------------------
* Retorna los días de un mes. Usada por Dif_AMD
*------------------------------------------------
FUNCTION DiasDelMes(dFecha)
LOCAL ld
ld = GOMONTH(dFecha,1)
RETURN DAY(ld - DAY(ld))
ENDFUNC
User avatar
Willi Quintana
 
Posts: 1022
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Postby dobfivewin » Tue Jul 29, 2008 8:56 am

Willi, Muchas Gracias me fue de gran ayuda, ya que me insentivó a arma una propia....

Va mi aporte de una forma particular de calcular Años/Meses/Dias entre dos fechas, llamar a la funcion :arrow: CalculaAMD(<Desde Fecha>,<Hasta Fecha>) y listo :) ....

Saludos a TODOS y espero que les sirva....


Code: Select all  Expand view  RUN
* Calculo AÑOS/MESES/DIAS entre 2 Fechas (por David Barrio)
Function CalculaAMD(Fecha1,Fecha2)
local Tiempo:='',FechaX,CantiMeses:=0
If Fecha1>Fecha2 ; return '' ; EndIf
Set Date ANSI
FechaX:=If( ctod(str(Year(Fecha2))+'.'+substr(dtoc(Fecha1),5,6)) > Fecha2,;
            ctod(str(Year(Fecha2)-1)+'.'+substr(dtoc(FechaX),5,6)) ,;
                 ctod(str(Year(Fecha2))+'.'+substr(dtoc(Fecha1),5,6)) )
Tiempo:=If(Year(FechaX)-Year(Fecha1)<>0,;
           Str(Year(FechaX)-Year(Fecha1),2)+;
                ' Año'+If(Year(FechaX)-Year(Fecha1)>1,'s',''),'')
While If(Month(FechaX)=12,;
         ctod(str(Year(FechaX)+1,4)+'.01.'+str(Day(FechaX),2)),;
         ctod(str(Year(FechaX),4)+'.'+str(Month(FechaX)+1,2)+'.'+str(Day(FechaX),2)) ) < Fecha2
  FechaX := If(Month(FechaX)=12,;
                ctod(str(Year(FechaX)+1,4)+'.01.'+str(Day(FechaX),2)),;
                ctod(str(Year(FechaX),4)+'.'+str(Month(FechaX)+1,2)+'.'+str(Day(FechaX),2)) )
   CantiMeses := CantiMeses + 1
EndDo
Tiempo:=alltrim(Tiempo+If(CantiMeses<>0,' '+Str(CantiMeses,2)+;
                          ' Mes'+If(CantiMeses>1,'es',''),'')+;
                       If(Fecha2-FechaX<>0,' '+str((Fecha2-FechaX),3)+;
                          ' Dia'+If(Fecha2-FechaX>1,'s',''),''))
*msginfo(Tiempo)
Set Date BRITISH
Return Tiempo


dbarrio
Argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 31 guests