Categories
Banco de dados Tutoriais

Formatos de data e hora no MySQL

Conheça as características básicas dos tipos de dados usados pelo MySQL para armazenar datas e horas: date, time, datetime, timestamp.

O MySQL tem tipos de campos específicos para representar data e hora: DATE e TIME, respectivamente.
Para representar valores combinados dos dois tipos, é possível usar o DATETIME.
Estes valores podem ser armazenados e apresentados nos seguintes formatos:

  • Os valores DATE são manipulados como strings no formato CCYY-MM-DD — onde CC, YY, MM e DD representam o século (century), o ano (year), o mês e o dia do mês.
  • Os valores TIME são representados por strings, no formato hh:mm:ss — hora (hh), minutos (mm) e segundos (ss).
    Os valores TIME podem ser entendidos como referentes à hora do dia. Na verdade, o MySQL os trata como tempo decorrido — de forma que um campo com este tipo de dado pode conter valores superiores a 23:59:59 ou, até mesmo, negativos.
    Caso você se interesse em saber, estes valores podem variar entre -838:59:59 e 838:59:59.
  • Valores DATETIME são strings combinadas de data e hora: CCYY-MM-DD hh:mm:ss.
  • O TIMESTAMP inclui data e hora, mas é representado em uma string CCYYMMDDhhmmss.
    Este tipo de campo possui algumas propriedades especiais e tem valores um pouco mais difíceis de se ler, à primeira vista. Como regra geral, contudo, você pode tratar os campos TIMESTAMP da mesma forma como trata os DATETIME.

No exemplo, abaixo, veja a representação dos campos ‘hora_saida’ e ‘hora_chegada’, da tabela ‘viagem’:

SELECT hora_saida, hora_chegada
    -> FROM viagem;
+------------------+--------------------+
| hora_saida       | hora_chegada       |
+------------------+--------------------+
|         15:00:00 |           15:00:00 |
|         05:01:30 |           02:30:20 |
|         12:30:20 |           17:30:45 |
+------------------+--------------------+

As datas, podem ser representadas, dentro da tabela, da seguinte forma:

SELECT data_saida
    -> FROM viagem;

Não se esqueça que as datas estão no formato ANO-MÊS-DIA:

+------------+
| data_saida |
+------------+
| 2015-02-28 |
| 2015-01-15 |
| 2015-03-05 |
| 2014-12-31 |
| 2015-06-04 |
+------------+

Os campos gravados com valores do tipo DATETIME, na minha tabela registros estão representados da seguinte forma:

SELECT data_nascimento
    -> FROM registros;
+---------------------+
|     data_nascimento |
+---------------------+
| 1970-01-01 00:00:00 |
| 1987-03-05 12:30:15 |
| 1999-12-31 09:00:00 |
| 2000-06-04 15:45:30 |
+---------------------+

Estes mesmos valores, se usado o formato do tipo TIMESTAMP, serão representados da seguinte forma:

SELECT data_nascimento
    -> FROM registros;
+------------------+
|  data_nascimento |
+------------------+
|   19700101000000 |
|   19870305123015 |
|   19991231090000 |
|   20000604154530 |
+------------------+

Como você pode ver, a leitura da informação TIMESTAMP é um pouco difícil, mas é um formato perfeito para nomear arquivos ou ser livremente formatado pelo desenvolvedor, através de funções de tratamento de strings.

Como lidar com os formatos de dados de data e hora no MySQL

O formato CCYY-MM-DD, usado pelo MySQL para armazenar dados referentes a data (DATE) segue o padrão ISO 8601. Este formato tem a vantagem de — uma vez que o ano, o mês e o dia serem representados com tamanhos fixos e da esquerda para direita – compor uma string que naturalmente é organizável em ordem temporal. Você pode usar este formato para compor nomes de arquivos que, ao ser listados em ordem alfabética, já ficarão naturalmente organizados também na ordem temporal.

Não é possível alterar a forma com o MySQL grava dados em campos DATE. Se você usa outro formato no seu programa, poderá usar uma função como a DATE_FORMAT() para adequar a string de data ao respectivo campo

Não é possível armazenar datas no formato DD/MM/YY (Dia/Mês/Ano). A função DATE_FORMAT também pode ser usada para formatar a exibição da data.
Alguns programadores optam por armazenar seus dados de datas como strings, em campos do tipo CHAR, comuns e lidam com as datas dentro de seus scripts — mas aí perde-se a possibilidade de fazer operações, dentro do banco de dados, com as datas (que pode trazer ganhos de performance para o sistema).
Quando a string de data já se encontra em formato semelhante ao requerido pela ISO, ele pode sequer precisar de qualquer tratamento para ser armazenado. A string 94-04-14, já será interpretada como 1994-04-14 pelo MySQL — e será armazenada como tal.
O mesmo vai acontecer se você repassar os valores 940414 ou 19940414.

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

3 replies on “Formatos de data e hora no MySQL”

Bom dia amigo,
Na busca de um erro no meu projeto sobre data, cheguei aqui neste seu artigo.
Tenho dois campos sobre data, que é dataentrada(tipo date) e datasaida(tipo date).
No insert preencho somente data de entrada para depois fazer a atualização quando for o momento de preencher a data de saída.
Acontece que ao executar o submit salvar registo, somente salva o registro no banco de dados se for preenchido a “data de saída”, caso contrário não salva o registro.
Este campo preciso somente a data e não com time.
Não consigo entender este erro, agradeço muito pela ajuda.

já verificou se o campo datasaida é not null?
se for, vc é obrigado a preencher, não podendo deixar vazio.

Olá amigo, vi um post seu sobre calculo de horas no mysql preciso muito da sua ajuda, aqui na empresa tenho um banco mysql que controla a saída de alguns carros, geralmente esses carros saiam no dia e voltava no mesmo dia, porém agora esses carros acabam voltando no dia seguinte es o meu problema. O banco estava modelado com as seguintes colunas:

DATA_SAIDA –> Date
HORA_INICIA –>Time

HORA_FINAL–>Time

O problema acontece quando o carro por exemplo sai as 21:00 e só retorna as 05:00 da manhã nesse calculo o mysql está entendendo que é as 17:00 da tarde e faz um calculo maior do que deveria, eu sei que está certo pois não tenho uma data_final porém preciso corrigir isso no relatório existe como eu verificar se a data está a noite e fazer o calculo correto?

Leave a Reply

Your email address will not be published. Required fields are marked *

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