none
Busca por datas RRS feed

  • Pergunta

  • Pessoa tenho os seguintes registros numa tabela:

    numerogmud data                                                   

    ---------- ------------------------------------------------------ 

    123        2011-01-12 16:46:00

    1234       2011-01-10 16:47:00

    12345      2011-01-13 16:50:00

    123456     2011-01-12 16:50:00

     

    quero pegar todos os registros que estão entre os dias 12 e 13 de janeiro de 2011. então fiz o seguinte:

    select * from gmud where data between convert(varchar(10),'2011-01-12',121) and convert(varchar(10),'2011-01-13',121)

    porém, não está me trazendo o registro do dia 13 que é o 12345.

     

    a data é do tipo smalldatetime

    pq?

     

    quarta-feira, 12 de janeiro de 2011 18:59

Respostas

Todas as Respostas

  • Rafa martin,

    o convert deve esta na sua coluna data, pois ela tem hora e v eta passando um filtro sem a hora, teste o script abaixo

    declare @tbTeste table (numerogmud int, data smalldatetime)
    insert into @tbTeste values(123,'2011-01-12 16:46:00')
    insert into @tbTeste values(1234,'2011-01-10 16:47:00')
    insert into @tbTeste values(12345,'2011-01-13 16:50:00')
    insert into @tbTeste values(123456,'2011-01-12 16:50:00')
    
    select * from @tbTeste where convert(varchar(10),data,121) between '2011-01-12' and '2011-01-13'
    
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 12 de janeiro de 2011 19:13
    Moderador
  • Rafa-Martin

     

    Quando se utiliza o comando BETWEEN ele contempla o intervalo informado, inclusive os próprios valores. No seu caso, a data limite será 2011-01-13, entretanto, como vc não informou a hora na conversão, o SQL vai assumir valores zeros e sua data limite (completa) será 2011-01-13 00:00:00.000.

    Sendo assim, a data cadastrada na tabela (dia 13) tem um horário cadastrado e é depois da data assumida pelo SQL, portanto, não será retornada na sua consulta.

    Se vc alterar para dia 14 o limite do BETWEEN, o dia 13 da tabela já será retornado.

     

    Abraços


    Erickson Ricci - MCP, MCTS, MCTS BI - ericksonricci.wordpress.com
    quarta-feira, 12 de janeiro de 2011 19:15
  • Boa Tarde,

    O momento "2011-01-13 16:50:00" é maior que o momento "2011-01-13", pois, esse segundo significa às 0h. Para evitar problemas com datas e planos de execução ineficientes, eu recomendo consultar no formato YYYYMMDD (sem hífen) e delimitar o intervalo com o valor inicial >= e o valor final <. Ex:

    declare @t table (numerogmud int, data datetime)
    insert into @t values (123,'2011-01-12 16:46:00')
    insert into @t values (1234,'2011-01-10 16:47:00')
    insert into @t values (12345,'2011-01-13 16:50:00')
    insert into @t values (123456,'2011-01-12 16:50:00')
    select numerogmud, data from @t
    where data >= '2011-01-12' and data < '2011-01-14'
    

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com/

    Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 07
    http://gustavomaiaaguiar.wordpress.com/2010/12/31/simulado-para-o-exame-70-433-mcts-microsoft-sql-server-2008-database-development-%e2%80%93-parte-07/


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 12 de janeiro de 2011 19:17
    • Marcado como Resposta Eder Costa sexta-feira, 14 de janeiro de 2011 17:23
    quarta-feira, 12 de janeiro de 2011 19:17
  • Valeu!
    quarta-feira, 12 de janeiro de 2011 19:17