Pegar resultado único de uma consulta com ResultSet

4 respostas Resolvido
javamysql
E

Bom dia…
Estou criando um sistema pra registro de ponto dos colaboradores do lugar onde trabalho.
Armazeno em uma tabela os registros feitos e no momento do último registro do dia, eu rodo uma função que calcula os saldos dos registros do dia.

  • Seleciona todos os registros de uma Pessoa.
  • Calcula o tempo de Expediente e de Café.
  • Finalmente insere na tabela de saldo os totais de saldo do dia.

Entre o primeiro e o segundo passo, rodo o SELECT ABAIXO(Considere as datas e ID, para facilitar o entendimento):

SELECT TIMESTAMPDIFF

(SECOND,

(SELECT r.data_hora

FROM registro AS r

WHERE r.data_hora BETWEEN 2019-11-26 00:00:00  AND 2019-11-26 23:59:59

AND r.id_oper = 1

AND r.id_colab = 1),

(SELECT r.data_hora

FROM registro AS r

WHERE r.data_hora BETWEEN 2019-11-26 00:00:00  AND 2019-11-26 23:59:59

AND r.id_oper = 2

AND r.id_colab = 1)

);

Quando faço consultas de vários registros, utilizo a lista e atribuo os valores por nome de coluna com o resultSet. Mas no caso do Select acima, eu recebo um retorno de resultado e não o valor de uma coluna.
E neste caso, não sei como atribuir esse valor a uma variável.
A nível de curiosidade, na classe Saldo, criei um atributo do tipo Float ‘result_dif’ e seus respectivos get e set.
Abaixo o Método que estava fazendo para pegar esse valor:

public List diferencaSaldo(int opeFim,int opeIni, int colab) {

String dia = Util.pegaData(dd);

List lSaldo = new ArrayList<>();
String sql = "SELECT TIMESTAMPDIFF(SECOND, "
			+		"(SELECT r.data_hora "
			+ 		 "FROM registro AS r "
			+		 "WHERE r.data_hora BETWEEN '2019-11-"+ dia +" 00:00:00' "
			+			" AND '2019-11-"+ dia +" 23:59:59' " 
			+			" AND r.id_oper = " + opeIni
			+			" AND r.id_colab = " + colab + "),"
			+		" (SELECT r.data_hora "
			+ 		 " FROM registro AS r"
			+			" WHERE r.data_hora BETWEEN '2019-11-"+ dia +" 00:00:00' "
			+			" AND '2019-11-"+ dia +" 23:59:59'"
			+			" AND r.id_oper = "+ opeFim
			+			" AND r.id_colab = " + colab + "));";
	System.out.println(sql);
	
	try {
		ResultSet result;
		PreparedStatement p = con.getConnection().prepareStatement(sql);
		System.out.println(p);
		result = p.executeQuery();
		
		while(result.next()) {
			Saldo saldo = new Saldo();
			
			saldo.setResultDif(result.???     );  //ESTOU AGARRADO AQUI!
			
			lSaldo.add(saldo);
			
			System.out.println(lSaldo);
		}
		p.close();
		System.out.println("Sucesso, Malucão!");
	} catch (Exception e) {
		System.out.println(e);
	}
	return lSaldo;
}

4 Respostas

J

Já tentou atribuir um alias na consulta e pegar o retorno pelo alias?

Exemplo:

SELECT TIMESTAMPDIFF( ... ) AS DIFERENCA

saldo.setResultDif(result.getInt("DIFERENCA"));

Ou

saldo.setResultDif(result.getInt(1));

E

Tentei das duas maneiras sim e não tive sucesso também.

E
Solucao aceita

Cara. Acabei de descobrir que estava colocando o ALIAS no lugar errado, tem que ser após a função TIMESTAMPDIFF().

Depois que falou, fui tentar de novo e deu certo…

Valeu pela ajuda!

J

Exatamente, teria que ficar da forma como coloquei no exemplo, caso contrário o alias ficaria internamente na função e não teria como ser referenciada externamente.

Criado 26 de novembro de 2019
Ultima resposta 26 de nov. de 2019
Respostas 4
Participantes 2