none
SQL para ficar louco :( RRS feed

  • Pergunta

  • Ola pessoal, to ficando louco com uma sql aqui, eu preciso buscar os dados de uma data X ate uma data Y e não estou conseguindo, a sql é para Mysql, olha só:

    Select Nome FROM tbl_tabela WHERE ( DATE_FORMAT(Data, '%d/%m/%Y') >= '10/03/2008' AND DATE_FORMAT(Data, '%d/%m/%Y') <= '31/10/2008' ) ORDER BY Data ASC";

     

    Não traz nenhum resultado mesmo existindo dados Sad, o campo Data esta como DATETIME no banco com esse formato,  '2008-10-01 13:31:35, alguem pode dar uma luz, ta dificil, sera que é bug, alguem ja apresentou esse problema?  Sad muito obrigado.

    sábado, 1 de novembro de 2008 07:33

Todas as Respostas

  • Boa Noite,

     

    Independente do SGBD acostume-se a não utilizar funções sobre campos em clásula WHERE. Construção como DATE_FORMAT(Data) são verdadeiros degradadores de desempenho e responsáveis por TABLE SCANs.

     

    No caso do SQL Server, eu sugiro a seguinte construção.

     

    Code Snippet

    SELECT * FROM Tabela

    WHERE Data >= 'Sua Data no formato YYYYMMDD sem traços' AND

    Data < 'A mesma data com um dia a mais'

     

    SELECT * FROM Tabela

    WHERE Data >= '20081031' AND Data < '20081101'

     

    -- Se for usar variáveis use o DATEADD

    DECLARE @Data DATETIME

    SET @Data = '20081031'

     

    SELECT * FROM Tabela

    WHERE Data >= @Data AND Data < DATEADD(D,1,@Data)

     

     

    Trabalhe seguindo essas orientações e nunca mais terá dores de cabeça com datas.

     

    [ ]s,

     

    Gustavo

     

    sábado, 1 de novembro de 2008 08:13
  •  

    Ola Gustavo, muito obrigado pela atenção, entao, o banco no caso é MySql e não SqlServer, não achei outro lugar para postar essa query, agradeço muito a sua atenção, no caso vi suas soluções e achei apesar de ser em SqlServer uma certa dificuldade sendo que deveria ser uma coisa facil, alias eu fazia essa função no banco ACCESS que é o mais ruim de todos e não tinha problema algum para realizar essa tarefa, não posso mudar o jeito do datetime lá no banco, tem que continuar padrão com -, to ficando louco amigo Sad não sei mais oque fazer Sad ja tentei de tudo, muito obrigado, abraços
    sábado, 1 de novembro de 2008 22:04
  • Olá Rafael,

     

    Talvez o problema esteja nos tipos de dados que você está tentando comparar. Não conheço muito o MySQL, mas parace ser algo neste sentido. Tenta uma das opções abaixo para ver se funciona, igualando as comparações entre DATE e DATE e não entre DATE e CHAR.

    Code Snippet

    SELECT Nome

    FROM tbl_tabela

    WHERE (

    DATE_FORMAT(Data, '%d/%m/%Y') >= DATE_FORMAT(Data, '10/03/2008') AND

    DATE_FORMAT(Data, '%d/%m/%Y') <= DATE_FORMAT(Data, '31/10/2008')

    )

    ORDER BY Data ASC

     

     

     

    SELECT Nome

    FROM tbl_tabela

    WHERE DATE_FORMAT(Data, '%d/%m/%Y')

    BETWEEN DATE_FORMAT(Data, '10/03/2008') AND DATE_FORMAT(Data, '31/10/2008')

    ORDER BY Data ASC

     

     

     

    Um abraço,

    Raul Santos

    terça-feira, 4 de novembro de 2008 12:43