1. O que é o DATETIME do MySQL?
O DATETIME do MySQL é um tipo de dado projetado para lidar simultaneamente com valores de data e hora. Gerenciar data e hora em um banco de dados é crucial para várias aplicações, como sistemas de registro ou de reservas. O tipo DATETIME armazena tanto a data quanto a hora em um único campo e pode conter uma ampla gama de valores, de '1000-01-01 00:00:00' a '9999-12-31 23:59:59', além de suportar segundos fracionários.
2. Visão geral dos tipos de dados de data e hora do MySQL
2.1 Tipos de dados para manipular datas e horas
O MySQL fornece os seguintes tipos de dados para manipular datas e horas:
DATE: Um tipo de dado para manipular datas (ano, mês, dia). O intervalo vai de'1000-01-01'a'9999-12-31'.TIME: Um tipo de dado para manipular apenas hora. O intervalo vai de'-838:59:59'a'838:59:59'.DATETIME: Um tipo de dado que combina data e hora. O intervalo vai de'1000-01-01 00:00:00'a'9999-12-31 23:59:59'.TIMESTAMP: Um tipo de dado para armazenar timestamps UNIX. O intervalo vai de'1970-01-01 00:00:01'a'2038-01-19 03:14:07'.
2.2 Diferenças entre DATETIME e TIMESTAMP
Embora DATETIME e TIMESTAMP sejam semelhantes, eles apresentam as seguintes diferenças principais:
- Fuso horário :
DATETIMEarmazena um valor fixo que é independente do fuso horário. Em contraste, os valoresTIMESTAMPsão convertidos para UTC no momento do armazenamento e depois convertidos de volta para o fuso horário atual do servidor ao serem recuperados. Portanto,DATETIMEé adequado para datas e horas que não são afetadas por fusos horários (por exemplo, horários de eventos), enquantoTIMESTAMPé mais apropriado para dados relacionados ao fuso horário do servidor, como registros de log. - Formato de armazenamento :
DATETIMEé armazenado em sua representação exata, enquantoTIMESTAMPé armazenado como um timestamp UNIX. Consequentemente,TIMESTAMPé influenciado pelas configurações de fuso horário do servidor para sua representação de tempo.
3. Como usar DATETIME no MySQL
3.1 Criando uma coluna DATETIME
Para criar uma coluna do tipo DATETIME, use a seguinte sintaxe SQL:
CREATE TABLE sample_table (
event_time DATETIME
);
Neste exemplo, estamos criando uma coluna DATETIME chamada event_time em uma tabela chamada sample_table.
3.2 Inserindo valores DATETIME
Os valores DATETIME do MySQL podem ser inseridos em vários formatos. O formato básico é 'YYYY-MM-DD HH:MM:SS'. Por exemplo:
INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');
Outros formatos permitidos incluem:
'YY-MM-DD HH:MM:SS': Um formato que especifica o ano com dois dígitos.'YYYYMMDDHHMMSS': Um formato que especifica os valores sem delimitadores.
Exemplos:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
Os dados inseridos nesses formatos serão salvos corretamente. Se o ano for especificado com dois dígitos, '70-99' será convertido para 1970-1999, e '00-69' será convertido para 2000-2069.
3.3 Recuperando valores DATETIME
Ao recuperar valores DATETIME, o MySQL os exibe no formato padrão 'YYYY-MM-DD HH:MM:SS'. Por exemplo:
SELECT event_time FROM sample_table;
Esta consulta exibirá os valores da coluna DATETIME da sua tabela no formato padrão.
4. Manipulando segundos fracionários
4.1 Precisão do DATETIME
O MySQL permite incluir segundos fracionários nos valores DATETIME. Você pode especificar a precisão usando a opção fsp, que permite armazenar segundos fracionários em um intervalo de 0 a 6. Por exemplo, para criar uma coluna com três casas decimais para segundos fracionários:
CREATE TABLE precise_times (
event_time DATETIME(3)
);
Neste exemplo, a coluna event_time pode armazenar até três dígitos de segundos fracionários.
4.2 Inserindo valores com segundos fracionários
Para inserir um valor DATETIME que inclua segundos fracionários, use o seguinte:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');
Esta consulta armazena valores com precisão, incluindo segundos fracionários. A parte fracionária inserida é armazenada sem truncamento, e sua precisão é mantida na recuperação.

5. Melhores Práticas para DATETIME
5.1 Quando Usar DATETIME vs. TIMESTAMP
- Use
DATETIMEquando : Armazenar datas e horas fixas que são independentes de fusos horários (por exemplo, horários de início de eventos, datas de reserva). - Use
TIMESTAMPquando : Armazenar dados de data e hora que estão relacionados ao fuso horário do servidor (por exemplo, horários de criação ou atualização de dados).
5.2 Gerenciando Fusos Horários
Como o DATETIME não possui um conceito de fusos horários, o gerenciamento de fuso horário deve ser tratado pela aplicação. Por outro lado, o TIMESTAMP leva automaticamente em conta o fuso horário do servidor ao armazenar e recuperar valores, tornando‑o adequado para operações em diferentes fusos horários ao redor do mundo.
6. Erros Comuns e Como Evitá‑los
6.1 Datas Zero e Valores Inválidos
No MySQL, ao tentar inserir um valor DATETIME inválido, será armazenada uma “data zero” '0000-00-00 00:00:00'. Como isso geralmente não é uma data válida, é fundamental validar a entrada de dados para impedir a inserção de valores inválidos. Implementar validações que garantam que os dados de entrada estejam dentro de intervalos e formatos adequados pode evitar o armazenamento de datas zero.
6.2 Uso Indevido de Precisão
Ao especificar a precisão de segundos fracionários, usar uma precisão incorreta pode gerar resultados indesejados. Especifique a precisão de segundos fracionários apenas quando necessário e configure o valor fsp com cuidado. Por exemplo sua aplicação não requer precisão subsegundo, não há necessidade de definir segundos fracionários para sua coluna DATETIME.
7. Conclusão
Este artigo forneceu uma explicação detalhada sobre o tipo de dado DATETIME do MySQL. DATETIME é um tipo de dado muito útil para lidar simultaneamente com data e hora, adequado para armazenar valores que não são afetados por fusos horários. Ao compreender as diferenças entre DATETIME e TIMESTAMP, o gerenciamento de fusos horários e o uso de segundos fracionários, você pode gerenciar efetivamente os dados de data e hora em seu banco de dados. Além disso, o conhecimento sobre erros comuns e suas estratégias de prevenção ajudará a manter a consistência e a confiabilidade dos dados.
8. Perguntas Frequentes (FAQ)
Q1: Quais são as principais diferenças entre DATETIME e TIMESTAMP?
DATETIME armazena uma data e hora fixas, independentes de fusos horários. Por exemplo, é adequado para armazenar datas de reserva ou horários de eventos que permanecem consistentes em todos os fusos horários. Em contraste, TIMESTAMP é armazenado com base em UTC e convertido para o fuso horário do servidor na recuperação. É adequado para dados sensíveis ao tempo, como registros de log que dependem do fuso horário do servidor.
Q2: Como posso armazenar segundos fracionários com DATETIME?
Ao criar uma coluna DATETIME, você pode definir a precisão dos segundos fracionários especificando o valor fsp. Por exemplo, ao especificar DATETIME(3), permite armazenar segundos fracionários com até três casas decimais. Ao inserir, use um valor que inclua segundos fracionários, e ele será armazenado no formato adequado.
Q3: Devo usar DATETIME ou TIMESTAMP?
Depende do seu caso de uso. Use DATETIME se quiser armazenar uma data e hora fixas. Por outro lado, use TIMESTAMP para dados de data e hora que são afetados pelo fuso horário do servidor, como horários de criação ou atualização de dados. TIMESTAMP é adequado quando a conversão automática de fuso horário é necessária, especialmente para operações em diferentes fusos horários.


