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;

+------------+
| 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’)

Melhores informações:

Publicado por Fábio Berbert de Paula em 23/07/2007
http://www.vivaolinux.com.br/dica/Convertendo-varchar-em-date-no-MySQL/

Compatilhe esse artigo!

Leave a Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

This site uses Akismet to reduce spam. Learn how your comment data is processed.