none
BETWEEN com mesma data RRS feed

  • Pergunta

  • Caros Colegas

     

    Preciso criar um Select que usa BETWEEN, até ai Blz, acontece que quando a faixa de datas é a mesma o resultado é NULO, ou vazio.

     

    Acho que isto acontece por causa do armazenamento da hora junto com a data exemplo:

     

    Data INICIAL                        Data FINAL deveri ser

    15/04/2008 00:00:00             15/04/2008 23:59:59

     

    Para funcionar teria que ser como descrito acima.

     

    Isto tem solução no SQL 2005, digo isto porque no SQL 2008, foi implementado o atributo somente DATE.

     

    Obrigado

    Bene

    segunda-feira, 5 de maio de 2008 14:32

Respostas

  • Oi Benê,

    Você pode usar conforme segue:

    Query

    SELECT * FROM TABELA WHERE data >= @dataInicial AND data <= @dataFinal



    Mesmo que as datas sejam iguais, funcionará!

    Se fui útil, me deixe saber!

    Abraços,
    Thiago Zavaschi
    segunda-feira, 5 de maio de 2008 14:39
  • Olá Benê,

     

    Não estou 100% certo de que o BETWEEN é mais eficiente (teríamos que testar o plano de execução para ter certeza), mas se você faz tanta questão do BETWEEN segue uma solução (que particularmente não gosto muito).

     

    Code Snippet

    CREATE TABLE #tbl (DATA SMALLDATETIME)

     

    INSERT INTO #tbl VALUES ('20080415 00:00')

    INSERT INTO #tbl VALUES ('20080415 05:59')

    INSERT INTO #tbl VALUES ('20080415 09:13')

    INSERT INTO #tbl VALUES ('20080415 15:42')

    INSERT INTO #tbl VALUES ('20080415 18:57')

    INSERT INTO #tbl VALUES ('20080415 23:59')

    INSERT INTO #tbl VALUES ('20080416 00:00')

     

    DECLARE @DATA SMALLDATETIME

    SET @DATA = '20080415'

     

    SELECT DATA FROM #tbl

    WHERE DATA BETWEEN @DATA AND (@DATA + 0.999)

     

    DROP TABLE #tbl

     

     

    Enquanto o DATE do SQL Server 2008 não vem sobram poucas alternativas

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 5 de maio de 2008 15:01
  • Gustavo,

     

    Também tenhos as minhas dúvidas pois o Between, trabalho de forma muito similar ao operador lógico condicional AND!!!

     

    segunda-feira, 5 de maio de 2008 15:26

Todas as Respostas

  • Oi Benê,

    Você pode usar conforme segue:

    Query

    SELECT * FROM TABELA WHERE data >= @dataInicial AND data <= @dataFinal



    Mesmo que as datas sejam iguais, funcionará!

    Se fui útil, me deixe saber!

    Abraços,
    Thiago Zavaschi
    segunda-feira, 5 de maio de 2008 14:39
  • ou usar convert na data

     

    select .... where convert(char(10),data,126) = '2008-05-05'

     

    Abs/

     

    segunda-feira, 5 de maio de 2008 14:45
  • Verdade Thiago.

     

    Mas aprendi que com o BETWEEN, a pesquisa é mais eficiente, mesmo porque a mesma data será uma exceção, a maioria das vezes será uma faixa de datas real e de grande abrangencia.

     

    Mesmo assim, sua dica é válida, mas gostaria de saber se existe solução usando o BETWEEN

     

    Obrigado

    Bene

     

    segunda-feira, 5 de maio de 2008 14:46
  • Olá Benê,

     

    Não estou 100% certo de que o BETWEEN é mais eficiente (teríamos que testar o plano de execução para ter certeza), mas se você faz tanta questão do BETWEEN segue uma solução (que particularmente não gosto muito).

     

    Code Snippet

    CREATE TABLE #tbl (DATA SMALLDATETIME)

     

    INSERT INTO #tbl VALUES ('20080415 00:00')

    INSERT INTO #tbl VALUES ('20080415 05:59')

    INSERT INTO #tbl VALUES ('20080415 09:13')

    INSERT INTO #tbl VALUES ('20080415 15:42')

    INSERT INTO #tbl VALUES ('20080415 18:57')

    INSERT INTO #tbl VALUES ('20080415 23:59')

    INSERT INTO #tbl VALUES ('20080416 00:00')

     

    DECLARE @DATA SMALLDATETIME

    SET @DATA = '20080415'

     

    SELECT DATA FROM #tbl

    WHERE DATA BETWEEN @DATA AND (@DATA + 0.999)

     

    DROP TABLE #tbl

     

     

    Enquanto o DATE do SQL Server 2008 não vem sobram poucas alternativas

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 5 de maio de 2008 15:01
  • Gustavo,

     

    Também tenhos as minhas dúvidas pois o Between, trabalho de forma muito similar ao operador lógico condicional AND!!!

     

    segunda-feira, 5 de maio de 2008 15:26
  • Colegas.

     

    Só estou repetindo o que li em meu estudos de SQL - "Boas praticas".

     

    Obrigado

    Bene

     

    segunda-feira, 5 de maio de 2008 16:18
  • Oi Benê,

     

    Não estou dizendo que não seja mas também não confirmo que seja.

     

    O grande problema de "SQL - Boas práticas" é que os autores devem lembrar de atualizá-las e muitas vezes pararem de disseminar "mitos". A cada lançamento os bancos de dados ficam mais inteligentes e muitas vezes o que era uma boa prática hoje não faz a menor diferença. Veja por exemplo duas boas práticas que foram sucesso no passado e que ainda são muito disseminadas

     

    - Informe as tabelas na cláusula FROM da menor para a maior

    - Nunca utilize instruções COUNT(*) mas sim COUNT(1) ou COUNT(0)

     

    Tais práticas faziam diferença no passado, mas hoje simplesmente não tem o menor efeito. Não interessa a ordem das tabelas, o banco (não falo apenas pelo SQL Server) irá escolher a melhor ordem no momento de executar a consulta. Não há diferença entre usar COUNT(*), COUNT(1) ou COUNT(0). Ambas produzem exatamente o mesmo plano de execução.

     

    No caso da data, caberia você testar as duas consultas e verificar de fato se o BETWEEN é mais eficiente (vou fazer esse teste qualquer hora dessas).

     

    [ ]s,

     

    Gustavo

    segunda-feira, 5 de maio de 2008 16:31
  • Oi Benê,

    Bom.. o BETWEEN realmente é melhor. O que você poderia fazer é uma rápida verificação a nível de código, antes de mandar para o banco. E dependendo, chamar uma stored procedure ou outra (ou algum procedimento que resulte no mesmo fim).

    Abração,
    Thiago Zavaschi
    segunda-feira, 5 de maio de 2008 16:33