Pergunta

Olá pessoal, estou apenas tentando extrair todos os registros do meu banco de dados que possuem um rec_date (varchar) armazenado como m/d/Y e estão expirados (como em, menos de curdate()), e esta chamada não está me dando o que eu quero:

SELECT member_id, 
       status, 
       DATE_FORMAT(STR_TO_DATE(rec_date, '%m/%d/%Y'), '%Y-%m-%d') AS rec
  FROM members 
 WHERE rec_date > CURDATE() 
   AND status = '1'

Obviamente estou fazendo algo errado, então você pode ajudar?

Foi útil?

Solução

Concordo com o zerkms que tipos de dados apropriados devem ser usados ​​sempre que possível.Caso contrário, você terá que usar uma subconsulta para converter primeiro a string/varchar em um tipo de dados DATE/TIME:

SELECT x.member_id,
       x.status,
       DATE_FORMAT(x.rec_dt, '%Y-%m-%d')
  FROM (SELECT m.member_id,
               m.status,
               STR_TO_DATE(m.rec_date, '%m/%d/%Y') AS rec_dt
          FROM MEMBERS m
         WHERE m.status = '1') x
 WHERE x.rec_dt < CURDATE()

Outras dicas

A maneira certa - é armazenar dados no tipo de campo adequado. Use o tipo de "data" em vez de "varchar".

De qualquer forma - você pode usar o date_format para formatar o rec_date para seriar à direita no local onde a cláusula e compará -la com o cenário ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top