Como subtrair datas para obter a quantidade de dias no iReport

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!

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

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.

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.

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.

amigo é tipo assim se estiver usando oracle

(dataFinal - dataInicial) as Data

[quote=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.[/quote]

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

[quote=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.[/quote]

Não estou usando data source fiz uma query e estou pegando os dados diretamente dela.

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

Vou criar um metodo aqui blz

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:

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;  } 

[quote=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.

[code]
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;  } 

[/code][/quote]

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