Comparação MySQL DATE_FORMAT com consulta CURDATE()
-
20-09-2019 - |
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?
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 ().