Consulta entre datas - Resolvido

StringBuilder hql = new StringBuilder();
hql.append(" FROM ").append(Declaracao.class.getSimpleName()).append(" dcl ");
hql.append(" WHERE 1 = 1 ");
if (filtro.getDataDeclaracao() != null) {
	if (filtro.getDataDeclaracao().getDe() != null) {
		hql.append(" AND dcl.dataCadastro >= :dataDeclaracaoDe ");
		parametros.put("dataDeclaracaoDe", filtro.getDataDeclaracao().getDe());
	}
	if (filtro.getDataDeclaracao().getAte() != null) {
		hql.append(" AND dcl.dataCadastro <= :dataDeclaracaoAte ");
		parametros.put("dataDeclaracaoAte", filtro.getDataDeclaracao().getAte());
	}
}

Gerando um SQL similar a este:

select * from DECLARACAO where DEC_DT_CADASTRO >= ‘07/01/2018’ and DEC_DT_CADASTRO <= ‘07/01/2018’

Mesmo tendo uma declaração com a data de ‘07/01/2018’, ele não retorna nenhum registro.

Mas se a consulta é gerada assim, retorna 1 registro.

select * from DECLARACAO where DEC_DT_CADASTRO >= ‘07/01/2018’ and DEC_DT_CADASTRO <= ‘08/01/2018’

Banco de dados é Oracle. O que pode de ser ?

1 curtida

O campo no banco é de que tipo? está com data e hora?

1 curtida

Somente Date.

não seria:

select * from DECLARACAO where DEC_DT_CADASTRO >= ‘07/01/2018’

a data entre 07/01/2018 e 07/01/2018 é 07/01/2018 mesmo

Pelo comportamento, eu diria que algum destes Date está com hora.
Verifique o valor usado nos parametros e no campo do banco (Date em java compreende data e hora).

Porque na pesquisa existe o campo Data inicio e Data fim, para serem consultados no mesmo campo.

A questão é que está indo com a data escolhida e é informado o tempo 07/01/2018 00:00:00.

O modelo está como Date e DTO está como Timestamp. Quem informa a pesquisa é o DTO, assim pesquisando no modelo que é Date.

faz um teste, executa diretamente no banco a seguinte sql:
select * from DECLARACAO where cast(DEC_DT_CADASTRO as DATE) between ‘07/01/2018’ and ‘07/01/2018’
*só não sei se no Oracle é assim o cast.

Resolvi assim: com o trunc

StringBuilder hql = new StringBuilder();
hql.append(" FROM ").append(Declaracao.class.getSimpleName()).append(" dcl ");
hql.append(" WHERE 1 = 1 ");
if (filtro.getDataDeclaracao() != null) {
	if (filtro.getDataDeclaracao().getDe() != null) {
		hql.append(" AND trunc(dcl.dataCadastro) >= :dataDeclaracaoDe ");
		parametros.put("dataDeclaracaoDe", filtro.getDataDeclaracao().getDe());
	}
	if (filtro.getDataDeclaracao().getAte() != null) {
		hql.append(" AND trunc(dcl.dataCadastro) <= :dataDeclaracaoAte ");
		parametros.put("dataDeclaracaoAte", filtro.getDataDeclaracao().getAte());
	}
}