Trabalhando corretamente com campos DATE no PHP e mySQL

Muitos programadores inexperientes ou preguiçosos com a intenção de poupar trabalho ou pesquisa, acabam usando campos do tipo VARCHAR para guardar dados do tipo DATE. Tudo vai funcionar perfeitamente até o momento em que for necessário realizar uma operação exclusiva de tempo como por exemplo ordenar dados por um certo período em uma consulta SQL.

O segredo para trabalhar com os dados DATE esta em convertê-los corretamente para o formato americano (YYYY-MM-DD) no momento de inserir do banco de dados, depois para exibir os valores, podemos formatá-los da maneira que acharmos mais conveniente:

Convertendo datas brasileiras para o formato americano e inserindo no mySQL: (DD/MM/AAAA para YYYY-MM-DD):

<?php
if(isset($_POST["meu_formulario"]))
// recebe os dados postados pelo usuário no formato brasileiro
{
$data = implode('-',array_reverse(explode('/',$_POST['data_brasileira'])));
// substitui as barras '/' por hifens '-' e inverte a ordem da string.
$sql = 'INSERT INTO tabela(campo_tipo_data) VALUES($data)';
$consulta = mysql_query($sql) or die(mysql_error());
// insere a data convertida no BD
}
?>

Exibindo datas no formato americano do mySQL para para o formato brasileiro (YYYY-MM-DD para DD/MM/AAAA):

<?php
$sql = “SELECT date_format(campo_tipo_data, '%d/%m/%Y') AS data FROM tabela”;
$consulta = mysql_query($sql) or die(mysql_error());
// consultando e convertendo...
while
(
$row = mysql_fetch_array($result))
{
echo 'Data: '. $row['data'];
// exibindo data convertida
}
?>

Explicação
date_format é uma funçõa do mySQL para formatação de campos data, a expressão:
date_format(campo_tipo_data, ‘%d/%m/%Y’) AS data cria um campo temporário date ou com o nome que você escolher.
Nota: a expressão acima pode ser concatenada dentro de sua consulta, exemplo:

SELECT campo1,campo2,campo3,date_format(campo4, '%d/%m/%Y') AS DATA,campo5 FROM tbdados WHERE campo1="meu_dado" ORDER BY campo2;

Gostou dessa matéria?

Inscreva seu email para receber atualizações com as últimas publicações do nosso blog.
[jetpack_subscription_form show_subscribers_total="false" button_on_newline="false" custom_font_size="16px" custom_border_radius="0" custom_border_weight="1" custom_padding="15" custom_spacing="10" submit_button_classes="" email_field_classes="" show_only_email_and_button="true" success_message="Sucesso! Enviamos um e-mail para confirmar a sua assinatura. Encontre o e-mail agora e clique em 'Confirmar' para iniciar a inscrição."]

14 opinaram!

Deixe sua opinião!
  1. Everything published made a bunch of sense. But, think
    on this, what if you were to write a killer headline?

  2. Pefeito!
    Finalmente alguém que não foge do desafio. Eu tentei de tudo quanto é jeito e não consegui. Tudo bem, eu não sou um ‘expert’ mesmo. E também não achei na internet nos vááários sites em que pesquisei. Todos só sabe falar de timestamp e data de sistema.
    Incrível, parece que ninguén nunca pensou que o usuário poderia digitar uma data em um formulário (isso sem usarmos algum tipo framework de calendário) em um campo como ‘Data de Entrega: [_____________]’.
    Mas eu não fiz exatamente como descrito acima. Para exibir novamente a data eu preferi usar o código na página php e não na consulta, como mencionado (date_format()).
    Apenas repeti o passo da inserção para reverter os números da data novamente:

    $databr = implode(‘/’, array_reverse(explode(“-“, $res[‘data_entrega’])));

    Tomando o cuidado de trocar o ‘-‘ pelo ‘/’.

    parabéns pelo post, você acabou de entrar ara meu bookmark.

    Abrç,
    Alexandre

  3. Olá muito bom seu post mas eu tenho uma pergunta, no exemplo da consulta você teve que chamar todos os campos do banco de dados manualmente, não tem uma forma de executar esse comando dessa linha

    $sql = “SELECT date_format(campo_tipo_data, ‘%d/%m/%Y’) AS data FROM tabela”;

    usando o * ao invés de digitar todos os campos da tabela? pois se eu tiver uma tabela com muitos campos acaba ficando meio lento o desenvolvimento

    • Olá Fernando, tudo bem? o campo “data” que mostrei no exemplo na realidade não existe na tabela, ele é criado pela função date_format por isso não dá pra chamar um “*”.
      Quando o resultado envolve um monte de campos, os dedos ficam coçando para digitar logo um “*”, mas a forma certa, é realmente retornar apenas os campos que precisamos usar.
      🙂 Abs!

      • Entendo, é que no caso eu tenho uma consulta que eu preciso de todos os campos da tabela onde eu tenho aproximadamente 45 campos e desses 2 são de data e eu preciso de todos os campos pois é uma consulta para relatório, usei seu exemplo para armazenar no banco de dados e ficou show, agora só estou com esse probleminha ai, eu vou ter que digitar todos os campos mesmo? não tem outra forma? valeuu

  4. Cara, muito legal o post. Sou novo na programação em php, então não entendi bem onde colocar esse codigo php para converter a data para o formato americano. Tentei colocar no campo do formulário de cadastro mas ela n converteu e a data ficou 0000-00-00 no banco de dados. Tem como me ajudar?

    • Olá Diego, você pode deixar seu formulário com o formato da data brasileiro e usar a função: $data = implode(‘-‘,array_reverse(explode(‘/’,$_POST[‘data_brasileira’]))); para convertê-la, agora a variável “$data” terá o formato americano e poderá ser inserida normalmente no banco de dados.

      • Olá Ivanilton, cara gostei da sua explicação. infelizmente cadastrei minhas datas como VARCHAR, e na pagina de consulta eu tenho que ordenar os registros pela data. Caso tenha as datas:
        26/11/2013, 04/12/2013, 28/10/2013, 05/11/2013, 06/12/2013
        ele ordena da seguinte forma, 04/12/2013, 05/11/2013, 06/12/2013, 26/11/2013, 28/10/2013
        o que esta totalmente errado, tem como usar essa data na ordem correta na minha pagina de exibição de cadastro?

  5. Ola, não sei de quando é este artigo, mas gostaria de tirar uma dúvida:
    este código acima, convertendo para datas brasileiras é colocado exatamente onde? Estou tentando usar um formulario com $insertSQL = sprintf() em linguagem php/mysql em modo local.

Deixe um comentário

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