Aprenda PL/SQL

BETWEEN não trazendo dados

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
  

Mensagemem Qui, 04 Out 2012 10:40 am

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:

select * from wms_cadlot where
DATFIMLOT BETWEEN :DTLOTINI AND :DTLOTFIN

DTLOTINI = 03/10/2012 AND DTLOTFIN = 03/10/2012--- não tras nada


quando passo

DTLOTINI = 03/10/2012 AND DTLOTFIN = 04/10/2012 --- tras os dados
bride
Localização: Belo Horizonte - MG

Bride
OCA Oracle PL/SQL Developer Certified Associate

Mensagemem Qui, 04 Out 2012 11:14 am

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

Código: Selecionar todos
select * from também where dtlotin >= to_date(01/01/2012,'dd/mm/yyyy') AND dtlotfim < to_date(02/01/2012,'dd/mm/yyyy') + 1


OU
Código: Selecionar todos
select * from também 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!!
dark neo

Mensagemem Qui, 04 Out 2012 1:19 pm

vou usar o " select * from wms_cadlot where DATFIMLOT >= to_date(:dataini,'dd/mm/yyyy') AND DATFIMLOT < to_date(:datafim,'dd/mm/yyyy') + 1 "
bride
Localização: Belo Horizonte - MG

Bride
OCA Oracle PL/SQL Developer Certified Associate

Mensagemem Qui, 04 Out 2012 2:20 pm

Não funciona


SELECT * FROM wms_cadlot where (DATFIMLOT >= TO_DATE(:DTLOTINI)) and (DATFIMLOT <= TO_DATE(:DTLOTFIN))
bride
Localização: Belo Horizonte - MG

Bride
OCA Oracle PL/SQL Developer Certified Associate

Mensagemem Qui, 04 Out 2012 2:56 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?
Código: Selecionar todos
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ç!!
dark neo

Mensagemem Sex, 05 Out 2012 10:45 am

na verdade funcionou desta forma

trunc(dtlotin) between trunc(:datini) AND trunc(datfim)
bride
Localização: Belo Horizonte - MG

Bride
OCA Oracle PL/SQL Developer Certified Associate

Mensagemem Ter, 09 Out 2012 5:06 pm

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:

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
fbifabio
Localização: São Paulo - SP

Fábio Prado
www.fabioprado.net

Mensagemem Qui, 11 Out 2012 3:04 pm

Tem que tratar a entrada com to_date
heraldoaraujo



Voltar para DBA Tuning

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante