1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Método que retorne o valor por cada periodo de dias e horas

Boa noite galera.

Construí um método (com ajuda de alguns amigos do forum) porém não estou conseguindo formular o resultado que preciso. É quase um desafio...rsrs Vamos la:

Tenho uma classe onde faço um select, selecionando por id, periodo de datas e horario do periodo de datas. Até ai ok!!! Porem agora no java eu preciso comparar os valores de cada dia verificando a diferença entre valores do horario inicial (mais cedo) até o ultimo horario trazido do dia.

Segue o código para entenderem melhor:

public class GetLeakageDAO implements DbConnectionDAO {

    private Connection conn = null;

    public String findAverage(ServletContext application, String dtIni,    String dtEnd, String serial, String port, String daysAnalysis, String hourInitial, String hourFinal ) throws NoSuchAlgorithmException, UnsupportedEncodingException,
            ParseException {
        ResultSet rs = null;
        PreparedStatement stmt = null;
        String mensagem = "";
        Double consumoInicial = 0.0;
        SimpleDateFormat sdtDia = new SimpleDateFormat("dd/MM/yyyy");
        boolean leakExist = false;

        /** Como parametrôs para o select é necessário data inicial e final do periodo que deseja que seja analisado, serial do medidor, porta, hora inicial e final do periodo analisado**/

        try {
            openConnection(application);

            String sqlSerial = new String();

            sqlSerial = "        select date_read, value_read, port, to_number(to_char(date_read,'DD')) AS dia_date_read\n";
            sqlSerial += "            from rs_individual_read ind \n";
            sqlSerial += "                inner join rs_counters rc on (ind.concentrator = rc.concentrator_counters) \n";
            sqlSerial += "                inner join rs_meter rm on (rm.oid_meter = rc.oid_meter) \n";
            sqlSerial += "                    where rm.serial_number_meter = ? and port = ? and date_read between ? and ? \n";
            sqlSerial += "                and to_number(to_char(date_read, 'HH24'))*60 + to_number(to_char(date_read, 'MI')) between ? *60 and ? *60 order by date_read asc \n";


            Timestamp dtInitial = new Timestamp(sdtDia.parse(dtIni).getTime());
            Timestamp dtFinal = new Timestamp(sdtDia.parse(dtEnd).getTime());

            stmt = conn.prepareStatement(sqlSerial);
            stmt.setString(1, serial);
            stmt.setString(2, port);
            stmt.setTimestamp(3, dtInitial);
            stmt.setTimestamp(4, dtFinal);
            stmt.setString(5, hourInitial);
            stmt.setString(6, hourFinal);

            rs = stmt.executeQuery();


            int dia = 0;
            int cont = 0;
            int daysAnl = Integer.parseInt(daysAnalysis);

            while (rs.next()) { 
                 dia = rs.getInt("dia_date_read");
                 consumoInicial = rs.getDouble("value_read");
                 cont = 0;

                 while (rs.getInt("dia_date_read") == dia ) {
                     if ( (rs.getDouble("value_read") - consumoInicial) > 0.100 ) {
                       cont += 1;
                     }
                         if(rs.next()){
                             dia = rs.getInt("dia_date_read");
                     }
                 }
                 if ( cont < daysAnl )  {
                     leakExist = false;
                 } else {
                     leakExist = true;
                     mensagem = "Houve " + cont + " dias com vazamento";
                }
            }
            closeConnection();
        } catch (ServletException | SQLException e) {
            e.printStackTrace();
        }

        return mensagem;

    }

    @Override
    public void openConnection(ServletContext application)
            throws ServletException {
        conn = WebDBConnection.getConnection(application);
    }

    @Override
    public void closeConnection() {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

}

Vou tentar melhorar a explicação.

O select vai retornar alguns dados dentro do periodo especificado de datas e horarios das datas usando os parametros:

stmt.setTimestamp(3, dtInitial); stmt.setTimestamp(4, dtFinal); stmt.setString(5, hourInitial); stmt.setString(6, hourFinal);

Os outros dois parametros identificam medidores, serial e porta do medidor até ai ok

Os dados que retornarem eu preciso comparar a coluna "value_read" que traz o valor de consumo do medidor dentro do periodo de horario mais ou menos assim:

Medidor 1 dia 01/07/2015 às 03:20hs marcava um consumo "value_read" de 100

Medidor 1 dia 01/07/2015 às 04:40hs marcava um consumo ("value_read") de foi de 120

Preciso pegar o valor de consumo do horario das 04:40 fazer menos o valor de consumo do horario 03:20 e verificar se foi maior que 0.100... porém no select serão retornados varios dias, e a comparação tem que ser feita no mesmo dia... Alem disso tenho que verificar isto num periodo de 3 dias ou seja, se houve consumo acima do permitido neste dia seria um dia com consumo suspeito. no proximo dia se houvesse também seriam 2 dias, se no terceiro dia houvesse também seriam 3 dias com consumo suspeito e isso sim resultaria numa suspeita de vazamento....

Ou seja o select vai retornar varios dias e horarios, porém eu preciso verificar qual foi o consumo daquele mesmo dia naquele periodo de horas, e verificar qual foi o consumo e se ele foi maior que 0.100... um tanto complicado....rsrs...

Estou quebrando a cabeça tentando resolver este problema...rsrs

mas não sei se existem alguns metodos dentro do java ou do sql que fariam esta comparação pra mim....

Alguem poderia me ajudar?

Com a ajuda do Moises deu uma boa andada! Porém ainda tenho um problema, parece que o while esta errado... tentei consertar de diversas formas sem sucesso... Resulta em uma mensagem de erro:

java.sql.SQLException: Conjunto de Resultados Esgotado

Obrigado!!!!

  • Edita sua pergunta e coloca exemplo de dados retornados da tabela e como deverá ficar aquilo que voce quer. Não entendi direito.

    moisesrs   16 de ago de 2015
  • moisesrs tentei explicar melhor no final... muito obrigado pela ajuda!!!

    brizola30   16 de ago de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags sql java ou faça a sua própria pergunta.