Como subtrair datas para obter a quantidade de dias no iReport
12 respostas
D
diegogm
Bom dia galera!
Bom estou fazendo um relatório para minha empresa usando o iReport 3.0 e nesse relatório tem 2 Fields com datas, no caso uma data de inicio de uma chamada técnica e outra a data final dessa chamada técnica, preciso fazer um cálculo creio que subtrai-las para obter a quantidade de dias que essa chamada técnica foi realizada, pesquisei no Google e não encontrei uma solução adequada infelizmente, só assim recorri ao GUJ.
Por favor se alguém puder me dar uma ajuda ficarei muito grato!!
Amigo se você está usando uma conexão com o banco oracle, você pode simplesmente subtrair
D
diegogm
Sim estou conectado ao banco, porém tenho que fazer um parâmetro com essa subtração e não encontro uma forma correta de fazer essa subtração, tipo uma fórmula correta para isso.
D
drsmachado
Nunca fiz isso, mas, creio que seja preciso converter para milissegundos (método getTime() da classe java.util.Date), realizar a subtração (long subDias = dtMsFim - dtMsIni), então, reconverter (long dias = subDias / 1000 / 60 / 60 / 24) para que funcione.
Só não consigo te dizer como fazer isso no iReport, provavelmente a sintaxe dele permita.
J
jhaga
E como você está passando estas informações para o relatório? Através de um data source? Se sim, faça o cálculo na sua classe e envie este dado e crie um field no relatório.
Se faz essa busca dentro do relatório, acredito que pode usar o mesmo procedimento. Sinceramente não sei se é possível fazer essa conta direto com duas datas no iReport, na verdade nunca tentei e nunca precisei, sempre passei os períodos direto pelo data source.
W
wesllhey
amigo é tipo assim se estiver usando oracle
(dataFinal - dataInicial) as Data
D
diegogm
drsmachado:
Nunca fiz isso, mas, creio que seja preciso converter para milissegundos (método getTime() da classe java.util.Date), realizar a subtração (long subDias = dtMsFim - dtMsIni), então, reconverter (long dias = subDias / 1000 / 60 / 60 / 24) para que funcione.
Só não consigo te dizer como fazer isso no iReport, provavelmente a sintaxe dele permita.
Legal vou fazer dessa maneira para ver se da certo!!!
D
diegogm
jhaga:
E como você está passando estas informações para o relatório? Através de um data source? Se sim, faça o cálculo na sua classe e envie este dado e crie um field no relatório.
Se faz essa busca dentro do relatório, acredito que pode usar o mesmo procedimento. Sinceramente não sei se é possível fazer essa conta direto com duas datas no iReport, na verdade nunca tentei e nunca precisei, sempre passei os períodos direto pelo data source.
Não estou usando data source fiz uma query e estou pegando os dados diretamente dela.
W
wesllhey
Se você está passando uma Collection para o Ireport então as datas ja deverão está subtraidas
W
wesllhey
Vou criar um metodo aqui blz
D
diegogm
Então tbm não estou usando Collection…
Blz cara será bom ver um metodo de exemplo para que eu possa entender. Valeww mesmo!
W
wesllhey
Pronto amigo ai é só você edita da forma que você quer usar, coloquei os nomes das variaveis bem simples para facilitar e coloquei alguns comentarios.
publicstaticintdataDiff(DatedataInicio,DatedataFim)throwsParseException{GregorianCalendarstartTime=newGregorianCalendar();GregorianCalendarendTime=newGregorianCalendar();GregorianCalendarcurTime=newGregorianCalendar();GregorianCalendarbaseTime=newGregorianCalendar();startTime.setTime(dataInicio);endTime.setTime(dataFim);intdif_multiplier=1;// Verifica a ordem de inicio das datas if(dataInicio.compareTo(dataFim)<0){baseTime.setTime(dataFim);curTime.setTime(dataInicio);dif_multiplier=1;}else{baseTime.setTime(dataInicio);curTime.setTime(dataFim);dif_multiplier=-1;}intresultadoDeAno=0;intresultadoDeMes=0;intresultadoDedia=0;// Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando // no total de dias. Ja leva em consideracao ano bissesto while(curTime.get(GregorianCalendar.YEAR)<baseTime.get(GregorianCalendar.YEAR)||curTime.get(GregorianCalendar.MONTH)<baseTime.get(GregorianCalendar.MONTH)){intmax_day=curTime.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);resultadoDeMes+=max_day;curTime.add(GregorianCalendar.MONTH,1);}// Marca que é um saldo negativo ou positivo resultadoDeMes=resultadoDeMes*dif_multiplier;// Retirna a diferenca de dias do total dos meses resultadoDedia+=(endTime.get(GregorianCalendar.DAY_OF_MONTH)-startTime.get(GregorianCalendar.DAY_OF_MONTH));returnresultadoDeAno+resultadoDeMes+resultadoDedia;}
D
diegogm
wesllhey:
Pronto amigo ai é só você edita da forma que você quer usar, coloquei os nomes das variaveis bem simples para facilitar e coloquei alguns comentarios.
publicstaticintdataDiff(DatedataInicio,DatedataFim)throwsParseException{GregorianCalendarstartTime=newGregorianCalendar();GregorianCalendarendTime=newGregorianCalendar();GregorianCalendarcurTime=newGregorianCalendar();GregorianCalendarbaseTime=newGregorianCalendar();startTime.setTime(dataInicio);endTime.setTime(dataFim);intdif_multiplier=1;// Verifica a ordem de inicio das datas if(dataInicio.compareTo(dataFim)<0){baseTime.setTime(dataFim);curTime.setTime(dataInicio);dif_multiplier=1;}else{baseTime.setTime(dataInicio);curTime.setTime(dataFim);dif_multiplier=-1;}intresultadoDeAno=0;intresultadoDeMes=0;intresultadoDedia=0;// Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando // no total de dias. Ja leva em consideracao ano bissesto while(curTime.get(GregorianCalendar.YEAR)<baseTime.get(GregorianCalendar.YEAR)||curTime.get(GregorianCalendar.MONTH)<baseTime.get(GregorianCalendar.MONTH)){intmax_day=curTime.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);resultadoDeMes+=max_day;curTime.add(GregorianCalendar.MONTH,1);}// Marca que é um saldo negativo ou positivo resultadoDeMes=resultadoDeMes*dif_multiplier;// Retirna a diferenca de dias do total dos meses resultadoDedia+=(endTime.get(GregorianCalendar.DAY_OF_MONTH)-startTime.get(GregorianCalendar.DAY_OF_MONTH));returnresultadoDeAno+resultadoDeMes+resultadoDedia;}
Poxa cara legal, vou fazer aqui e com certeza agora vai dar certo!!
Obrigado mesmo! :)