Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

murilomlb

Select para comparar datas

Recommended Posts

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.