Calculo de diferença entre Timestamp do javaSQL

Fala pessoal.
Sou um aprendiz em JAVA, principalmente trabalhando junto com banco de dados.
Estou tentando desenvolver um sistema simples pra registro de ponto pros colaboradores da loja que eu trabalho.
A parte dos registros já está ok. Mas me surgiu uma grande dificuldade na hora de calcular os saldos.
Estou fazendo o seguinte:

  • Durante o registro do ponto de fim de expediente, consulto o horário do registro de entrada desse mesmo expediente. (Exemplo: Entrada e Saída - Manhã)
  • Na consulta, atribuo o DataHora a uma variável do tipo Timestamp.

Abaixo o meu código:

//METODO DE CONSULTA

public List selectRegistros(int ope, int colab, String where) {
List lRegistro = new ArrayList<>();
String sql = Strings.selectRegistros + where;
System.out.println(sql);

	try {
		ResultSet result;
		PreparedStatement p = con.getConnection().prepareStatement(sql);
		System.out.println(p);
		result = p.executeQuery();
		
		while(result.next()) {
			Registro registro = new Registro();
			
			registro.setId(result.getInt("r.id_registro"));
			registro.setId_colab(result.getInt("r.id_colab"));
			registro.setId_oper(result.getInt("r.id_oper"));
			registro.setData(result.getTimestamp("r.data_hora"));
			registro.setStatus(result.getString("r.sta"));
			
			lRegistro.add(registro);
			
			System.out.println(lRegistro);
		}
		p.close();
		System.out.println("Sucesso, Malucão!");
	} catch (Exception e) {
		System.out.println(e);
	}
	return lRegistro;
}

//METODO QUE RETORNA A DATA DE ABERTURA DO EXPEDIENTE

public Timestamp buscaAberturaSaldo(int colab, int ope) throws Exception {
ConnectionFactory con = new ConnectionFactory();
RegistroDao rDao = new RegistroDao(con);
ColaboradorDAO cDao = new ColaboradorDAO(con);
Timestamp data_hora = null;
int id_operacao = 0;

	String data = Util.pegaData("yyyy-MM-dd");
	
	if(ope == 2 || ope == 4 || ope == 6 || ope == 8) {
		if(ope == 2)
			id_operacao = 1;
		else if(ope == 4)
			id_operacao = 3;
		else if(ope == 6)
			id_operacao = 5;
		else
			id_operacao = 7;
		
		String where = "r.id_colab = "+ colab + " AND r.id_oper = "+ id_operacao  +" AND r.data_hora < '"+ data +" 23:59:59'";
		
		rDao.selectRegistros(colab, ope, where);
		
		try {
			for(Registro r: rDao.selectRegistros(colab, ope, where)) 
				data_hora = r.getData();
			
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
	return data_hora;
}

//METODO DE CALCULO DE SALDO (TIVE FÉ QUE O SINAL DE SUBTRAÇÃO RESOLVERIA KK)

public Timestamp calculaSaldo(int colab, int ope, Timestamp saldoFim ) {
Consultas sql = new Consultas();
Timestamp resultadoSaldo;

	try {
		resultadoSaldo = (saldoFim - sql.buscaAberturaSaldo(colab, ope));
	}catch (Exception e) {
		// TODO: handle exception
	}
	
	return resultadoSaldo;
}

Procurei sobre uma outra possibilidade e não sei se o Timestamp é o tipo ideal que eu deveria trabalhar, ou se existe alguma possibilidade não tão complexa.

Espero que possam me ajudar e valeu!!

Está tentando calcular no java ou no sql mesmo? Qual versão do java?

Estou tentando pelo Java, mas se houver possibilidade pelo SQL, resolveria meu problema também.
Estou usando o Java 8u212

Como está usando a versão 8 do java, use o LocalDateTime, ele provê uma farta gama de opções para operações com datas e horas.
Assim, fica fácil calcular essa diferença.

Vou dar uma olhada nessa opção…
Obrigado pela ajuda amigo!

Tive problema no momento de usar o metodo result.getTimestamp, na hora de pegar o nome da coluna que vou inserir.

Tentei mudar pra Date() também, mas sem sucesso pra esses casos de comunicação com BD.

Sem especificar o tal problema, não tem como adivinhar. Pode ser N coisas, por favor, ajude-nos a te ajudar, apresente mensagens de erro ou o comportamento apresentado.

Esse é o método que utilizei acima para pegar os resultados do BD:

try {
ResultSet result;
PreparedStatement p = con.getConnection().prepareStatement(sql);
System.out.println§;
result = p.executeQuery();

	while(result.next()) {
		Registro registro = new Registro();
		
		registro.setId(result.getInt("r.id_registro"));
		registro.setId_colab(result.getInt("r.id_colab"));
		registro.setId_oper(result.getInt("r.id_oper"));
		registro.setData(result.getTimestamp("r.data_hora"));
		registro.setStatus(result.getString("r.sta"));
		
		lRegistro.add(registro);
		
		System.out.println(lRegistro);
	}
	p.close();
	System.out.println("Sucesso, Malucão!");
} catch (Exception e) {
	System.out.println(e);
}
return lRegistro;

}

Utilizando o Timestamp, tenho essa sentença:

‘registro.setData(result.getTimestamp(“r.data_hora”));’,

onde registro é a instância da minha classe modelo, setData, o meu método set para atribuir valor, result é instância do Resultset. O problema está no momento de pegar a informação da coluna, pois o método .getTimestamp() ou getDate() não é compatível com LocalDateTime e não existe um .getLocalDateTime ou .getDateTime.

Atualmente, com o Timestamp eu já consigo inserir, alterar e consultar o banco de dados.
O meu problema inicial está em realizar operações aritiméticas (No caso cálculo de diferença entre as datas, para cálculo de saldo).

Qual a classe do atributo data do registro?

Atualmente está com o Timestamp, mas tentei usar o LocalDateTime e o Date, sem sucesso, pelos motivos que disse anteriormente.

Abaixo a classe modelo:

public class Registro {

//c.id, c.nome, r.data_hora, c.pendencia_expediente, c.pendencia_cafe, o.id, o.nome

private int id;
private int id_colab;
private int id_oper;
private String colaborador;
private Timestamp data;
private int pendencia_expediente;
private int pendencia_cafe;
private String status;


public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public int getId_colab() {
	return id_colab;
}

public void setId_colab(int id_colab) {
	this.id_colab = id_colab;
}

public int getId_oper() {
	return id_oper;
}

public void setId_oper(int id_oper) {
	this.id_oper = id_oper;
}

public int getPendencia_expediente() {
	return pendencia_expediente;
}

public void setPendencia_expediente(int pendencia_expediente) {
	this.pendencia_expediente = pendencia_expediente;
}

public int getPendencia_cafe() {
	return pendencia_cafe;
}

public void setPendencia_cafe(int pendencia_cafe) {
	this.pendencia_cafe = pendencia_cafe;
}

public int getOperacao() {
	return id;
}

public void setOperacao(int id) {
	this.id = id;
}

public String getStatus() {
	return status;
}
public void setStatus(String status) {
	this.status = status;
}

public String getColaborador() {
	return colaborador;
}
public void setColaborador(String colaborador) {
	this.colaborador = colaborador;
}

public Timestamp getData() {
	return data;
}
public void setData(Timestamp data) {
	this.data = data;
}

}

Bom, como eu disse, você só comentou que teve problemas, não especificou quais.
Ocorre que você não vai conseguir pegar um objeto do tipo java.sql.Timestamp e converter, automaticamente, para LocalDateTime. Você precisa fazer a conversão manualmente.

Boa…

Achei um tópico no stackOverflow : https://stackoverflow.com/questions/23263490/how-to-convert-java-sql-timestamp-to-localdate-java8-java-time

Vou ver ser consigo por aí…

Mais uma vez, obrigado!