emotta Posted August 5, 2014 Report Share Posted August 5, 2014 Tentei disponibilizar em dicas mas não consegui. Esta é uma função bem simples que retorna diferença entre datas em Anos, Meses e Dias. Vi algumas que faziam isso mas achei os códigos grandes e complicados... Fiz uma mais limpa... Exemplo: Diferença entre as datas 01/01/2012 e 05/08/2014 Retorno: 2 anos 7 meses e 4 dias... // exemplo de uso Function u_Teste() Local dData1 Local dData2 Local aRet Set Date to Briti dData1 := CtoD("01/01/2012") // ano bissexto dData2 := CtoD("05/08/2014") MsgStop(StrAnoMesDia(dData1,dData2)) aRet := AnoMesDia(dData1,dData2) MsgStop(Str(aRet[1],6)+" => anos") MsgStop(Str(aRet[2],6)+" => meses") MsgStop(Str(aRet[3],6)+" => dias") Return /* ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±± ±±³Fun‡„o ³ AnoMesDia ³ Autor | Eduardo Motta ³ Data ³25/05/2012³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±± ±±³Descri‡„o ³ Retorna array com 3 posicao referente a diferenca em ano,mes ³±± ±±³ ³ e dias das datas passadas ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Sintaxe ³ AnoMesDia(dData1,dData2) ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Parametros³ ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Uso ³ ³±± ±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß */ Function AnoMesDia(dData1,dData2) Local nDifAno Local nDifMes Local nDifDia //dData2++ // caso queira considerar o dia corrente. Ex: 01/01/2012 - 02/01/2012 => 2 dias. Caso queira desconsiderar comente a linha que o resultado seria 1 dia. nDifAno := Year(dData2)-Year(dData1) nDifMes := Month(dData2)-Month(dData1) nDifDia := Day(dData2)-Day(dData1) If Month(dData1) > Month(dData2) .or. (Month(dData1) == Month(dData2) .and. Day(dData1) > Day(dData2)) nDifAno-- nDifMes+=12 EndIf If Day(dData1) > Day(dData2) nDifMes-- nDifDia := Day(EoM(AddMonth(dData2,-1))) + nDifDia + 1 EndIf Return {nDifAno,nDifMes,nDifDia} /* ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±± ±±³Fun‡„o ³StrAnoMesDia³ Autor | Eduardo Motta ³ Data ³25/05/2012³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±± ±±³Descri‡„o ³ Retorna string contendo descricao da diferenca em ano, mes e ³±± ±±³ ³ e dia das datas passadas ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Sintaxe ³ AnoMesDia(dData1,dData2) ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Parametros³ ³±± ±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±± ±±³Uso ³ ³±± ±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß */ Function StrAnoMesDia(dData1,dData2) Local aRet Local cStr := "" Default dData1 := &("M->"+ReadVar()) Default dData2 := Date() aRet := AnoMesDia(dData1,dData2) If Empty(dData1) .or. Empty(dData2) .or. (dData1 >= dData2) Return cStr EndIf If aRet[1] == 1 cStr+=AllTrim(Str(aRet[1],6))+" ano " ElseIf aRet[1] > 1 cStr+=AllTrim(Str(aRet[1],6))+" anos " EndIf If aRet[2] == 1 cStr+=AllTrim(Str(aRet[2],6))+" mês " ElseIf aRet[2] > 1 cStr+=AllTrim(Str(aRet[2],6))+" meses " EndIf If aRet[3] == 1 cStr+=AllTrim(Str(aRet[3],6))+" dia " ElseIf aRet[3] > 1 cStr+=AllTrim(Str(aRet[3],6))+" dias " EndIf Return cStr Quote Link to comment Share on other sites More sharing options...
sambomb Posted August 5, 2014 Report Share Posted August 5, 2014 E ta funcionando com anos bissextos?Exemplo: 01/01/2012 até 01/01/2013 da 366 dias? Quote Link to comment Share on other sites More sharing options...
gilmer Posted August 5, 2014 Report Share Posted August 5, 2014 Para disponibilizar em dicas é necessário passar para .zip kapiaba 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted August 5, 2014 Author Report Share Posted August 5, 2014 Gilmer farei isso... Sambo, pra ter o resultado de 366 dias é só vc fazer o tradicional, subtrair uma data da outra. A minha função é pra retornar a diferença como expliquei, em ano, meses e dias... Exemplo: Diferença entre as datas 01/01/2012 e 05/08/2014 Retorno: 2 anos 7 meses e 4 dias... E sim, funciona com ano bissexto sambomb and vagner 2 Quote Link to comment Share on other sites More sharing options...
emotta Posted August 5, 2014 Author Report Share Posted August 5, 2014 Postado em dicas Gilmer... obrigado http://fivewin.com.br/index.php?/files/file/1103-anomesdiaprg/ Theotokos 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.