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

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?

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.

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

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

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

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;