Convertendo String para Date no MySQL

Por - setembro 03, 2011


Quem nunca se deparou numa situação onde precisa salvar um cliente que tem um sistema e o desenvolvedor responsável abandonou o barco? Pois bem tive essa experiência.
A primeira emoção dessa empreitada foi emitir uma listagem a partir de um banco de dados MySQL, todavia, o problema é que o relatório era com intervalo de datas e o todas os campos onde armazenavam datas eram do tipo varchar. Agora vou mostrar como resolver esse problema com uma funções do MySQL.
Podemos fazer de duas formas diferentes que varia de acordo com a versão do MySQL:

Versão anterior a 4.0

Temos que fazer a conversão da data manualmente via manipulação de String.
SELECT nome, dtCadastro 
FROM empresa 
WHERE DATE_ADD(CONCAT(SUBSTRING_INDEX('dtCadastro','/',-1) , '-' , SUBSTRING_INDEX(substring_index('dtCadastro','/',2),'/',-1) , '-', SUBSTRING_INDEX('dtCadastro','/',1)), interval 0 day) 
BETWEEN '2011-07-25' AND '2011-08-25'

Versão superior a 4.0

Temos uma função chamada STR_TO_DATE que faz a conversão de STRING para DATE.
SELECT nome, dtCadastro 
FROM empresa 
WHERE STR_TO_DATE(dtCadastro,'%d/%m/%Y')
BETWEEN '2011-07-25' AND '2011-08-25'
Veja mais informação sobre a função em:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

VOCÊ PODE GOSTAR

9 comments

  1. Olá Alessandro,
    Sei que o post é antigo, mas estou com dificuldades para gerar uma listagem no mysql e talvez você possa me ajudar.
    Tenho uma série de registros e preciso listar os que são do mês corrente e dos dois meses posteriores.
    Por exemplo, como estamos em dezembro, lista dezembro/2012, janeiro/2013 e fevereiro/2013. Eu consegui fazer, porém da forma que fiz só começa contar a data a partir do dia atual:

    WHERE DATE(c1.previsao_fechamento) >= DATE(NOW())
    AND UNIX_TIMESTAMP(c1.previsao_fechamento) <= '".mktime(0,0,0,date('m') + 3,date('d'),date('Y'))."'
    AND YEAR(c1.previsao_fechamento)>=YEAR(NOW())

    Tentei mudar a primeira linha do WHERE para

    WHERE MONTH(c1.previsao_fechamento) >= MONTH(NOW())

    Desta forma ele inicia no primeiro registro do mês atual, como eu quero, porém não lista os outros dois meses posteriores.

    Tem uma idéia para mim?
    Origado e parabéns pelo post.

    ResponderExcluir
  2. Olá Julio,

    Sugiro que você manipule a data de inicio para sempre no inicio do mês, concatene as partes para você conseguir gerar '2012-12-01 00:00:00', tente algo assim:

    WHERE DATE(c1.previsao_fechamento) >= DATE(CONCAT(Year(now()),'-', Month(now()),'-01 00:00:00'))

    Posta ai se deu certo.

    Alessandro Gonzalez

    ResponderExcluir
  3. ola amigo... tenho um campo aonde se armazenava ano e mes como varchar no banco. tenho que pegar essa data, adicionar alguns meses de acordo com outro campo da tabela e salvar em outro campo. estou fazendo assim:

    UPDATE MINHA_TABELA SET `NOVA_DATA` = DATE_ADD(STR_TO_DATE(`ANTIGA_DATA`, '%Y%m'), INTERVAL `QTD_ADD` MONTH)

    A nova data esta saindo null. como eu poderia resolver essa questao?

    ResponderExcluir
  4. Parabéns pelo post.
    prático, direto e funcional.
    não é mais um dos sites com conteúdo inútil na internet.

    ResponderExcluir
  5. Oi, Alessandro!

    Parabéns pelo blog e pelo artigo!
    Estou com uma dúvida e queria ver com você se consegue me ajudar, por favor.
    Tenho um campo na minha tabela no MySQL que é do tipo varchar e armazena uma data, no formato: 2016-04-27T21:42:34-03:00

    Preciso fazer um select filtrando os últimos 3 dias desse campo de data, mas não estou conseguindo fazer o filtro convertendo de varchar pra date.

    Poderia me ajudar, por favor?

    Obrigado!

    ResponderExcluir
  6. Olá Anônimo,

    Pode usar a função STR_TO_DATE desta forma:

    SELECT STR_TO_DATE('2016-04-27T21:42:34-03:00', '%Y-%m-%d')

    O retorno será: 2016-04-27

    Você notará que o valor retornado estará convertida em data, quando for utilizar em seu where o valor de comparação deve ser date.

    Espero ter ajudado.

    ResponderExcluir