Como subtrair datas para obter a quantidade de dias no iReport

12 respostas
D

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!!

Obrigado a todos!

12 Respostas

W

Amigo se você está usando uma conexão com o banco oracle, você pode simplesmente subtrair

D

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

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

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

amigo é tipo assim se estiver usando oracle

(dataFinal - dataInicial) as Data

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.

Legal vou fazer dessa maneira para ver se da certo!!! :slight_smile:

D

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

Se você está passando uma Collection para o Ireport então as datas ja deverão está subtraidas

W

Vou criar um metodo aqui blz

D

Então tbm não estou usando Collection…
Blz cara será bom ver um metodo de exemplo para que eu possa entender. Valeww mesmo! :slight_smile:

W

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.

public static int dataDiff(Date dataInicio, Date dataFim) throws ParseException {  
	     GregorianCalendar startTime = new GregorianCalendar();  
	     GregorianCalendar endTime = new GregorianCalendar();  
	       
	     GregorianCalendar curTime = new GregorianCalendar();  
	     GregorianCalendar baseTime = new GregorianCalendar();  
	  
	     startTime.setTime(dataInicio);  
	     endTime.setTime(dataFim);  
	       
	     int dif_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;  
	     }  
	     int resultadoDeAno = 0;  
	     int resultadoDeMes = 0;  
	     int resultadoDedia = 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)  )  
	     {  
	         int max_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));  
	       
	     return resultadoDeAno + resultadoDeMes + resultadoDedia;  }
D
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.
public static int dataDiff(Date dataInicio, Date dataFim) throws ParseException {  
	     GregorianCalendar startTime = new GregorianCalendar();  
	     GregorianCalendar endTime = new GregorianCalendar();  
	       
	     GregorianCalendar curTime = new GregorianCalendar();  
	     GregorianCalendar baseTime = new GregorianCalendar();  
	  
	     startTime.setTime(dataInicio);  
	     endTime.setTime(dataFim);  
	       
	     int dif_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;  
	     }  
	     int resultadoDeAno = 0;  
	     int resultadoDeMes = 0;  
	     int resultadoDedia = 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)  )  
	     {  
	         int max_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));  
	       
	     return resultadoDeAno + resultadoDeMes + resultadoDedia;  }

Poxa cara legal, vou fazer aqui e com certeza agora vai dar certo!!
Obrigado mesmo! :)

Criado 2 de agosto de 2012
Ultima resposta 2 de ago. de 2012
Respostas 12
Participantes 4