murilomlb 0 Denunciar post Postado Junho 22, 2011 Olá, Estou com um problema... Eu tenho uma tabela com o campo aniversario, mas ele está em varchar Os dados são inseridos dessa maneira: 22/06/1968 Eu preciso consultar essas datas, ou seja, tenho um formulário onde coloco a data inicial e a data final, mas somente o dia e o mês e tenho que retornar todos os aniversariantes que estão nesse período de tempo. Como que fica meu sql? Eu tentei usar o between assim: BETWEEN '17/09' and '19/09' o dia ele traz correto, mas ele também compara o mês e não traz as datas certas. Alguém teria uma solução? Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Junho 23, 2011 Casos assim sÃO bem legais pois nos permitem utilizar técnicas mais refinadas para tratar a informação, como esta que foi definida de forma errada. Antes de comentar uma solução para o caso, sugiro à você que estude uma possível migração desta coluna char ou varchar para uma coluna do tipo date (date ou datetime) para que haja melhor armazenamento dos dados e seu sistema ganhe em performance e mantenha os processo de recuperação dos dados mais simplificado, que é o mais interessante. Vamos lá... Criei a seguintes tabela com os respectivos dados de exemplo: mysql> create table birthdate (bithdate char(12)); Query OK, 0 rows affected (0.00 sec) mysql> insert into birthdate values ('01/12/1999'), ('03/12/1999'), ('07/12/1999'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 Bom, montei um função para que retorne no seu SELECT o dado já no tipo DATE, no formato YYYY-MM-DD, formato o qual o MySQL entende melhor. A função recebe uma data no formato DD/MM/YYYY e retorna uma string no formato YYYY-MM-DD com tipo DATE, easy peasy de entender... CREATE FUNCTION converte(var CHAR(12)) returns DATE deterministic BEGIN DECLARE data_varchar CHAR(12); SET data_varchar = CONCAT(SUBSTRING(var,7,4),'-',SUBSTRING(var,4,2),'-',SUBSTRING(var,1,2)); RETURN data_varchar; END // Após criar a função, você pode selecionar os dados e montar sua lista de aniversariantes de acordo com o seu filtro: mysql> SELECT converte(birthdate) -> FROM birthdate -> WHERE converte(birthdate) BETWEEN converte('01/12/1999') AND converte('05/12/1999'); +---------------------+ | converte(birthdate) | +---------------------+ | 1999-12-01 | | 1999-12-03 | +---------------------+ 2 rows in set (0.00 sec) :joia: Compartilhar este post Link para o post Compartilhar em outros sites
murilomlb 0 Denunciar post Postado Junho 27, 2011 Quase isso cara, Mas eu não posso comparar com o ANO, pois existem vários anos diferentes mas com a mesma data de aniversario Como que eu faço isso com esse exemplo que você me mostrou? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 27, 2011 Faz uma busca neste site murilomlb pois este problema e recorrente, já vi pelo menos meia dúzia de tópicos semelhantes, um deve te ajudar. Compartilhar este post Link para o post Compartilhar em outros sites