Busca entre período de datas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
reppold
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 10 Dez 2011 1:42 pm

Bom dia colegas!

Estou com a seguinte questão, tenho uma tabela que possui itens que possuem validade (data de inicio e fim).
Onde posso selecionar um período de datas X e quero ver todas os itens que estão validos dentro deste período ou que sua data de inicio ou de fim esteja dentro do período.

Estou fazendo o WHERE da seguinte forma:

Selecionar tudo

AND (V_DATA_INICIO BETWEEN DATAINICIAL and DATAFINAL 
  OR V_DATA_FIM BETWEEN DATAINICIAL AND DATAFINAL)
Isso me traz os resultado corretos porem é muito LENTO devido ao número enorme de registro que existe na tabela.

Gostaria de suas opiniões se tem como fazer isto de uma forma mais rápida ou algum tipo de INIDICE que possa ser usado para este caso.

Grato por vossa atenção.

Obrigado.
gledson.veras
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 10 Dez 2013 10:03 am

Cara, acho que a condição abaixo já resolve seu problema se eu entendi direito...

Selecionar tudo

AND TABELA.DATA_VALIDADE_INICIAL >= V_DATA_INI
AND TABELA.DATA_VALIDADE_FINAL   <= V_DATA_FIM
reppold
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 10 Dez 2011 1:42 pm

Gledson obrigado pela resposta mas isso não resolve.

Vou tentar ser mais claro, são três regras que devo obedecer:

1) Se data inicial da validade estiver entre a data de inicio ou fim a linha é válida.
2) Se data final da validade estiver entre a data de inicio ou fim a linha é válida.
3) Se dentro do período de validade do produto estiver parte ou todo o período informado entre a data de inicio e fim a linha é valida exemplo:

Lista de produto válidos de 1/12/2013 até 1/01/2014:

Selecionar tudo

PRODUTO 	VALIDADE INICIAL	VALIDADE FINAL      VALIDO
P1	        20140101	                20140102                   S
P2	        20131225	                20131227                   S
P3	        20140102	                20140205                   N
P4	        20131225	                20140225                   S
Essa condição satisfaz a minha necessidade:

Selecionar tudo

AND (V_DATA_INICIO BETWEEN DATAINICIAL and DATAFINAL 
         OR V_DATA_FIM BETWEEN DATAINICIAL AND DATAFINAL)
Porem isto é muito lento pois pelo que pesquisei desta forma ele não consegue utilizar index para realizar a busca.

A minha pergunta é se existe algum tipo de index que posso utilizar para melhores isto ou alguma outra forma que eu possa utilizar a query para poder ser mais rápida?

Obrigado.
Editado pela última vez por reppold em Ter, 10 Dez 2013 3:16 pm, em um total de 1 vez.
Avatar do usuário
adrianoturbo
Moderador
Moderador
Mensagens: 393
Registrado em: Qui, 20 Mar 2008 4:09 pm
Localização: Brasília
Adriano Alves
---Para cada problema dificil existe uma solução simples.----

Brother,qual o tipo de índice está usando ?Nornal,B-Tree ou Bitmap?
Não sei como é a sua atual estrutura ,se essa tabelas que está usando sofrem atualizações constantemente ou se é esporádico e com baixa cardinalidade ,de qualquer forma já adianto que ,caso sejam atualizadas constantemente o melhor seria utilizar índices B-tree que melhoraria a performance de sua consulta significativamente ,agora se a situação é esporádica,quase não acontece atualização o indicado seria usar o Bitmap,os índices Bitmaps são indicados para ambientes com perfil de DW .
Outra solução seria fazer um rebuild dos seus indíces atuais.
gledson.veras
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 10 Dez 2013 10:03 am

Cara, esses parametros que você passou estao corretos?

1/12/2013 a 1/12/2013?

O P2 tem datas de validade superior a isso e você colocou como valido.
reppold
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 10 Dez 2011 1:42 pm

Glender,

Em equivoquei no período já editei o post:

Lista de produto válidos de 1/12/2013 até 1/01/2014.

Adriano,

As colunas de data de inicio e fim são usadas como um índice normal.
E é sim uma tabela muito utilizada.
Responder
  • Informação
  • Quem está online

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