BETWEEN não trazendo dados

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Pessoal bom dia estou com um problema no BETWEEN, quando passo datas iguals ele não tras dados, quando passo um dia anterior e um dia apos ele traz.. alguém sabe se é isso mesmo

ex:

Selecionar tudo

select * from wms_cadlot where
  DATFIMLOT BETWEEN :DTLOTINI AND :DTLOTFIN
não tras nada:

Selecionar tudo

DTLOTINI = 03/10/2012  AND DTLOTFIN = 03/10/2012
quando passo assim tras os dados

Selecionar tudo

DTLOTINI = 03/10/2012  AND DTLOTFIN = 04/10/2012 
dark neo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 27 Set 2012 3:06 pm

você poderia usar o trunc para ele descartar a hora ou usar maior e menor.
vou te dar um exemplo.

Selecionar tudo

select * from tb where dtlotin >= to_date(01/01/2012,'dd/mm/yyyy') AND dtlotfim < to_date(02/01/2012,'dd/mm/yyyy') + 1
OU

Selecionar tudo

select * from tb where dtlotin  between to_date(trunc(01/01/2012,'dd/mm/yyyy')) 
AND dtlotfim to_date(trunc(02/01/2012,'dd/mm/yyyy')) 
testa assim é vê se funciona!!
abraço!!
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

vou usar

Selecionar tudo

select * 
from wms_cadlot 
where DATFIMLOT >= to_date(:dataini,'dd/mm/yyyy') 
  AND DATFIMLOT < to_date(:datafim,'dd/mm/yyyy') +  1
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Não funciona

Selecionar tudo

SELECT * 
FROM wms_cadlot 
where (DATFIMLOT >= TO_DATE(:DTLOTINI)) and (DATFIMLOT <= TO_DATE(:DTLOTFIN))
dark neo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 27 Set 2012 3:06 pm

desculpa o trunc esta em um lugar incorreto


no seu select você esta colocando o where entre parentese e outra você colocou : pontos ao lado da varivel por que?

Selecionar tudo

 select * from wms_cadlot where DATINICIOLOT >= to_date(dataini,'dd/mm/yyyy') 
AND DATFIMLOT < to_date(datafim,'dd/mm/yyyy')
você tabe estava colocando o mesmo campo o certo não seria dataini e data fim?

abç!!
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

na verdade funcionou desta forma

Selecionar tudo

 trunc(dtlotin)  between trunc(:datini) AND trunc(datfim)
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

bride,

Eu evitaria usar função na coluna dtlotin. Nos meus treinamentos de SQL Tuning é uma primeiras coisas que comento ao tunar instruções SQL. Sempre q você usa uma função em uma coluna, se existir um índice nela, o índice será ignorado e isso causará um Full Table Scan, que irá degradar a performance da consulta. Tente fazer coisas como no exemplo abaixo, considerando que dtlotin é uma coluna com tipo date e possui um índice:

Selecionar tudo

dtlotin between to_date('01/01/2012 00:00:00', 'dd/mm/yyyy hh24:mi:ss) AND to_date('01/01/2012 23:59:59', 'dd/mm/yyyy hh24:mi:ss)
obs.: Usando a função no lado oposto da coluna você não terá a sobrecarga de converter cada valor da coluna em todas as linhas da consulta e se houver um índice btree, você irá usá-lo!

[]s

Fábio Prado
www.fabioprado.net
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

Tem que tratar a entrada com to_date
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes