Convertendo varchar em date no MySQL
Dica publicada em Banco de Dados / MySQL
Convertendo varchar em date no MySQL
Peguei uma manutenção de um sistema PHP/MySQL pra fazer e surgiu a necessidade de ordenar determinada tabela pelo campo data, porém pra minha surpresa esse campo era do tipo VARCHAR() ao invés de DATE() ou DATETIME().
A data estava armazenada na tabela no formato "dd/mm/yyyy", exemplo:
SELECT data FROM contas;
SELECT data FROM contas ORDER BY data;
Pra resolver esse problema sem ter de mexer na tabela (o que não tinha permissão pra fazer), use a função str_to_date() do MySQL:
SELECT str_to_date(data, '%d/%m/%Y') AS data FROM contas ORDER BY data;
str_to_date(CAMPO, 'formato armazenado da string')
Maiores informações:
A data estava armazenada na tabela no formato "dd/mm/yyyy", exemplo:
SELECT data FROM contas;
+------------+ | data | +------------+ | 26/11/2003 | | 04/12/2003 | | 28/11/2003 | | 05/12/2003 | | 29/12/2003 | +------------+O problema é que ao mandar ordenar a tabela por data, por ser VARCHAR o resultado não funciona como o esperado:
SELECT data FROM contas ORDER BY data;
+------------+ | data | +------------+ | 04/12/2003 | | 05/12/2003 | | 26/11/2003 | | 28/11/2003 | | 29/12/2003 | +------------+Isso acontece porque se o campo é texto, ele começa a ordenar da esquerda pra direita em ordem alfanumérica, onde 04/12 é menor que 26/11, o que está errado, visto que em data a gente precisa levar em conta, em ordem de prioridade, ano-mês-dia.
Pra resolver esse problema sem ter de mexer na tabela (o que não tinha permissão pra fazer), use a função str_to_date() do MySQL:
SELECT str_to_date(data, '%d/%m/%Y') AS data FROM contas ORDER BY data;
+------------+ | data | +------------+ | 2003-11-26 | | 2003-11-28 | | 2003-12-04 | | 2003-12-05 | | 2003-12-29 | +------------+Hmmm, agora sim! A sintaxe da função é:
str_to_date(CAMPO, 'formato armazenado da string')
Maiores informações:
UPDATE tabela set data=str_to_date(data, '%d.%m.%Y')
a data estava assim: 01.01.2001