[Resolvido] Problemas com comparação de datas no postgres

3 respostas
D

Pessoal,

Estou com o seguinte problema: eu armazeno uma data no meu banco de dados postgres, usando a seguinte notação @Temporal(TemporalType.TIMESTAMP).
Aqui está minha classe:

package br.pe.gov.ses.pme.modelo;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.ManyToAny;

@Entity
public class Quantitativo implements Serializable  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(sequenceName="quantitativo_SEQ",name="quantitativo_SEQ", allocationSize=1, initialValue=1)
	@GeneratedValue(generator="quantitativo_SEQ",strategy=GenerationType.SEQUENCE)
	private Long id;
	
	@ManyToOne
	@JoinColumn(name="quantitativoExibicao_id")
	private QuantitativoExibicao quantitativoExibicao;
	
	@OneToOne
	@JoinColumn(name="HOSPITAL_ID")
	@NotNull(message="É necessário escolher um hospital")
	private Hospital hospital;
	
	@OneToOne
	@JoinColumn(name="ESPECIALIDADE_ID")
	@NotNull(message="É necessário escolher uma especialidade")
	private Especialidade especialidade;
	
	private int quantidade;
	
	private int encaminhamentos = 2;
	
	@NotNull(message="É necessário escolher uma data")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data")
	private Date data;
	
	//1: diurno, 2: noturno
	@NotNull(message="Você deve informar um turno")
	@Column(name="turno")
	private Integer turno;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
	
	
	public Hospital getHospital() {
		return hospital;
	}

	public void setHospital(Hospital hospital) {
		this.hospital = hospital;
	}

	public Especialidade getEspecialidade() {
		return especialidade;
	}

	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}

	public int getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

	public int getEncaminhamentos() {
		return encaminhamentos;
	}

	public void setEncaminhamentos(int encaminhamentos) {
		this.encaminhamentos = encaminhamentos;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public Integer getTurno() {
		return turno;
	}

	public void setTurno(Integer turno) {
		this.turno = turno;
	}
}

Só que na hora de gerar o relatório, quando tento comparar um objeto do tipo Date com a data armazenada no banco de dados, o formato dos dois não é o mesmo.
Faço isso para comparar:

case ESPECIALIDADE:
				
				sql = "select case when q.turno = 1 then 'Diurno' when q.turno = 2 then 'Noturno' else '' end as Plantao, q.data as data, e.nome as especialidade, h.nome as hospital, q.quantidade from quantitativo as q INNER JOIN hospital as h ON h.id = q.hospital_id INNER JOIN especialidade as e ON e.id = q.especialidade_id AND e.nome LIKE " + "'" + especialidade.getNome() + "'" +  "AND q.turno = "+ this.turno + "AND q.data = " + this.getDataRelatorio();
				tipoRelatorio = "RELATORIO_POR_ESPECIALIDADE.jasper";
				relatorio = "especialidade";            
				
				break;

Sendo que o método getDataRelatorio() é da seguinte forma:

public Date getDataRelatorio() {
		return dataRelatorio;
	}

Enquanto no banco de dados a data está armazenada assim: 2012-07-26 00:00:00, o this.getDataRelatorio() retorna a data com o formato Thu Jul 26 00:00:00 GMT-03:00 2012.
O que eu posso fazer para resolver isso?

3 Respostas

E

ao invés de você concatenar strings, melhor você passar como parâmetros mesmo.

Se for em JPQL (ou HQL) você pode, no lugar do valor, colocar :data (por exemplo), e no Query (objeto da classe Query) que gerou com o JPQL, você usa o método setParameter(‘data’, minhaData); em que “minhaData” é o objeto da classe Date.

CristianPalmaSola10

Qual é o tipo do campo que guarda essa na data na base de dados?

o erro pode esta ai nos minutos segundos e milisegundos como voce disse


Enquanto no banco de dados a data está armazenada assim: 2012-07-26 00:00:00, o this.getDataRelatorio() retorna a data com o formato Thu Jul 26 00:00:00 GMT-03:00 2012.
O que eu posso fazer para resolver isso?

O que eu ja fiz e faria para resolver isso é o seguinte
pegar a data do relatorio e setar
hora =0, minuto = 0, segundo = 0 milisegundo =0
depois fazer uma copia desse objeto e setar
hora = 23, minuto = 59, segundo = 59, milisegundo =9999

e no sql fazer um between

AND q.data between data_com_hora_segundo_minuto_mil_zero and hora_com_valores_maximos_para_propriedades
D

Pessoal,

Consegui resolver transformando os dados em segundos para depois fazer a comparação.

case ESPECIALIDADE:
				
				sql = "select case when q.turno = 1 then 'Diurno' when q.turno = 2 then 'Noturno' else '' end as Plantao, q.data as data,
 e.nome as especialidade, h.nome as hospital, q.quantidade from quantitativo as q 
INNER JOIN hospital as h ON h.id = q.hospital_id INNER JOIN especialidade as e ON e.id = q.especialidade_id AND e.nome LIKE " +
 "'" + especialidade.getNome() + "'" +  "AND q.turno = "+ this.turno + "AND (SELECT EXTRACT(EPOCH FROM q.data) = " + this.getDataRelatorio().getTime()/1000 +")";
				tipoRelatorio = "RELATORIO_POR_ESPECIALIDADE.jasper";
				relatorio = "especialidade";
								break;
Criado 30 de julho de 2012
Ultima resposta 30 de jul. de 2012
Respostas 3
Participantes 3