Convertendo varchar em date no MySQL

Publicado por Fábio Berbert de Paula em 23/07/2007

[ Hits: 54.183 ]

Blog: https://fabio.automatizando.dev

 


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')

Maiores informações:
Outras dicas deste autor

Vim - implemente um "substituir tudo" no modo BOSS

Instalando Docker no Debian 10 Buster

Como recuperar uma senha salva no Chrome ou Firefox

Como passar parâmetros para um alias no Bash

Como desabilitar o protocolo SSL3 no Nginx

Leitura recomendada

MySQL - Recuperar dados em ordem aleatória (randômica)

Recuperando a senha do root de seu MySQL

Usando transações com MySQL

Segurança básica no MySQL

Comandos úteis do MySQL

  

Comentários
[1] Comentário enviado por hardwarez em 20/03/2008 - 12:25h

Boa Fábio!!! me serviu aki para converter um banco de dados que importei (DBF) q veio com as datas todas zuadas

UPDATE tabela set data=str_to_date(data, '%d.%m.%Y')

a data estava assim: 01.01.2001

[2] Comentário enviado por fabianoplanura em 06/02/2016 - 18:27h

Pessoal, sou novo aqui.

Estou precisando da ajuda de vocês e desde já agradeço a quem pudem dar alguma dica.
Gostaria de saber como faço para usar uma variável para busca com essa função: SELECT str_to_date(data, '%d/%m/%Y') AS data FROM contas ORDER BY data;

Segue meu codigo:

$query_rs_licitacoes = "SELECT * FROM tb_licitacoes WHERE tb_licitacoes.descricao LIKE '%$busca%' OR tb_licitacoes.data = '$busca' OR tb_licitacoes.modalidade = '$busca' ORDER BY data DESC";

Desse jeito não está ficando em ordem decrescente e tentei de várias maneiras inserir o Select str_to_date aí junto e não deu certo.

Para mostrar somente a coluna data dá certo, mas preciso que exiba as outras também. Alguém tem alguma idéia.
Depois pretendo usar um echo transDate para inverter a data para ficar ddmmyyyy.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts