Aritmética de Datas no MySQL: DATE_ADD, DATE_SUB e INTERVAL (Com Exemplos Práticos)

目次

1. Introdução

MySQL é um SGBDR (Sistema de Gerenciamento de Banco de Dados Relacional) amplamente usado em aplicações web e na administração de bancos de dados. Entre suas muitas funcionalidades, operações com datas são uma das funções mais importantes que os desenvolvedores utilizam diariamente. Por exemplo, existem inúmeros cenários envolvendo datas, como definir lembretes recorrentes, extrair dados dentro de um intervalo de tempo específico e calcular cronogramas.

Em particular, adicionar e subtrair datas é algo muito frequente. O MySQL oferece funções convenientes como DATE_ADD e DATE_SUB, além da cláusula INTERVAL para especificar durações. Ao aproveitar essas ferramentas, você pode manter o código conciso enquanto realiza cálculos de data complexos de forma eficiente.

Neste artigo, explicaremos a adição e subtração de datas no MySQL de maneira amigável para iniciantes. Cobriremos tudo, desde o uso básico até exemplos avançados, e forneceremos know‑how prático que você pode aplicar em projetos reais. Também abordaremos problemas comuns e pontos importantes a observar, para que, mesmo que você não se sinta confiante no manuseio de datas, possa aprender com tranquilidade.

Ao terminar a leitura, você terá o conhecimento e as técnicas práticas necessárias para operações com datas no MySQL — e será capaz de aplicá‑las em seus próprios projetos.

2. Conhecimentos Básicos Necessários para Operações com Datas no MySQL

Ao trabalhar com datas no MySQL, é importante entender primeiro os tipos de dados de data/hora e os conceitos fundamentais. Esta seção explica o conhecimento básico que você precisa para operações com datas no MySQL.

Tipos de Dados de Data/Hora

O MySQL oferece vários tipos de dados para lidar com datas e horas. Compreender as características de cada tipo e escolher o mais adequado é essencial.

  1. DATE
  • Armazena uma data do calendário (ano, mês, dia).
  • Formato: YYYY-MM-DD
  • Exemplo: 2025-01-01
  • Use quando precisar apenas de uma data (ex.: aniversário, data de criação).
  1. DATETIME
  • Armazena data e hora.
  • Formato: YYYY-MM-DD HH:MM:SS
  • Exemplo: 2025-01-01 12:30:45
  • Use quando precisar de data e hora juntas (ex.: timestamp de um evento).
  1. TIMESTAMP
  • Armazena data/hora baseada em UTC (Tempo Universal Coordenado) e suporta conversão de fuso horário.
  • Formato: YYYY-MM-DD HH:MM:SS
  • Exemplo: 2025-01-01 12:30:45
  • Utilizado quando são necessários dados sensíveis a fuso horário ou para logs de sistema.
  1. TIME
  • Armazena um valor de hora.
  • Formato: HH:MM:SS
  • Exemplo: 12:30:45
  • Use quando precisar apenas de um valor de hora puro (ex.: horário de expediente).
  1. YEAR
  • Armazena apenas o valor do ano.
  • Formato: YYYY
  • Exemplo: 2025
  • Use ao gerenciar dados em nível de ano.

Observações Importantes ao Usar Tipos de Data/Hora

  • Configurações de fuso horário – O MySQL usa, por padrão, as configurações de fuso horário do servidor. Contudo, se sua aplicação utiliza um fuso diferente, podem ocorrer inconsistências nos dados. Defina o fuso horário explicitamente quando necessário.
  • Manipulação de datas inválidas – Por padrão, o MySQL está configurado para gerar erro se for especificada uma data inválida (ex.: 2025-02-30). Entretanto, dependendo da configuração do servidor, a data pode ser convertida para NULL ou um valor padrão, sendo importante verificar suas definições.

Casos de Uso Comuns para Operações com Datas

  1. Extrair dados de um período específico
  • Exemplo: Recuperar dados de vendas da última semana.
  1. Cálculos de cronograma
  • Exemplo: Enviar uma notificação 30 dias após o registro de um usuário.
  1. Gerenciamento de datas de validade
  • Exemplo: Controlar datas de expiração de cupons.

Resumo dos Conceitos Básicos

O MySQL fornece ferramentas poderosas para lidar com datas e horas. Ao entender os tipos de dados de data/hora e escolher o mais adequado, você pode melhorar o design do banco de dados e a eficiência das consultas. Na próxima seção, analisaremos mais detalhadamente a função DATE_ADD como método concreto para operações com datas.

3. Função DATE_ADD: Conceitos Básicos e Uso Prático

A função DATE_ADD do MySQL é uma ferramenta conveniente usada para adicionar um intervalo especificado a uma data. Esta seção explica tudo, desde o uso básico até exemplos práticos.

O que é DATE_ADD?

DATE_ADD adiciona a duração especificada em uma cláusula INTERVAL a uma data fornecida e retorna uma nova data. É uma ferramenta fundamental para simplificar cálculos de datas.

Sintaxe básica:

DATE_ADD(date, INTERVAL value unit)
  • date : A data ou datetime a ser operada.
  • value : O número a ser adicionado.
  • unit : A unidade do intervalo (ex.: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

Unidades INTERVAL disponíveis

Você pode usar as seguintes unidades INTERVAL com DATE_ADD.

UnitDescription
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
WEEKWeeks
MONTHMonths
YEARYears

Exemplos básicos

Aqui estão exemplos concretos de DATE_ADD.

  1. Calcular 1 dia depois :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY);
    

Resultado: 2025-01-02

  1. Calcular 1 mês depois :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 MONTH);
    

Resultado: 2025-02-01

  1. Calcular 1 ano depois :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 YEAR);
    

Resultado: 2026-01-01

  1. Calcular 3 horas depois :
    SELECT DATE_ADD('2025-01-01 12:00:00', INTERVAL 3 HOUR);
    

Resultado: 2025-01-01 15:00:00

  1. Adicionar múltiplas unidades (usando aninhamento) :
    SELECT DATE_ADD(DATE_ADD('2025-01-01', INTERVAL 1 DAY), INTERVAL 3 HOUR);
    

Resultado: 2025-01-02 03:00:00

Cálculos de datas dinâmicos

Você também pode aplicar DATE_ADD a datas calculadas dinamicamente.

  1. Calcular 7 dias a partir de hoje :
    SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY);
    

Resultado: A data 7 dias a partir de hoje.

  1. Calcular 30 minutos a partir de agora :
    SELECT DATE_ADD(NOW(), INTERVAL 30 MINUTE);
    

Resultado: O datetime 30 minutos a partir de agora.

Exemplos práticos

  1. Calculando uma data de expiração : Calcule um período de garantia de 30 dias a partir da data de compra.
    SELECT DATE_ADD(purchase_date, INTERVAL 30 DAY) AS expiry_date
    FROM orders;
    
  1. Enviando um lembrete de reserva : Calcule 3 dias antes da data de um evento e envie um lembrete.
    SELECT DATE_ADD(event_date, INTERVAL -3 DAY) AS reminder_date
    FROM events;
    
  1. Calculando o corte de retenção de logs : Calcule 90 dias antes de hoje e exclua logs mais antigos que isso.
    DELETE FROM logs
    WHERE log_date < DATE_ADD(CURDATE(), INTERVAL -90 DAY);
    

Observações

  • Manipulação de datas inválidas : Se o resultado de DATE_ADD se tornar uma data inválida, o MySQL pode retornar NULL. Certifique‑se de que os dados de entrada estejam em um formato válido.
  • Impacto do fuso horário : Se você estiver usando fusos horários, funções como CURRENT_TIMESTAMP e NOW() podem ser afetadas.

DATE_ADD é uma das ferramentas mais básicas, porém poderosas, para operações de datas no MySQL. Depois de dominá‑la, você poderá lidar com muitos cálculos de datas de forma eficiente. Na próxima seção, abordaremos a função DATE_SUB em detalhes.

4. Função DATE_SUB: Conceitos básicos e uso prático

DATE_SUB é a contraparte do DATE_ADD no MySQL. É usada para subtrair um intervalo especificado de uma data. Esta seção explica os conceitos básicos e exemplos práticos que você pode usar no trabalho real.

O que é DATE_SUB?

DATE_SUB subtrai a duração especificada em uma cláusula INTERVAL de uma data ou datetime fornecido e retorna uma nova data. É uma ferramenta conveniente para subtração de datas.

Sintaxe básica:

DATE_SUB(date, INTERVAL value unit)
  • date : A data ou datetime a ser operada.
  • value : O número a ser subtraído.
  • unit : A unidade do intervalo (ex.: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

Exemplos básicos

Aqui estão exemplos concretos de DATE_SUB.

  1. Calcular 1 dia antes :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 DAY);
    

Resultado: 2024-12-31

  1. Calcular 1 mês antes :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH);
    

Resultado: 2024-12-01

  1. Calcular 1 ano antes :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 YEAR);
    

Resultado: 2024-01-01

  1. Calcular 3 horas antes :
    SELECT DATE_SUB('2025-01-01 12:00:00', INTERVAL 3 HOUR);
    

Resultado: 2025-01-01 09:00:00

  1. Subtrair múltiplas unidades (usando aninhamento) :
    SELECT DATE_SUB(DATE_SUB('2025-01-01', INTERVAL 1 DAY), INTERVAL 3 HOUR);
    

Resultado: 2024-12-31 21:00:00

Cálculos de Data Dinâmicos

Você também pode usar DATE_SUB com base em datas dinâmicas.

  1. Calcular 7 dias antes de hoje :
    SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY);
    

Resultado: A data 7 dias antes de hoje.

  1. Calcular 30 minutos antes de agora :
    SELECT DATE_SUB(NOW(), INTERVAL 30 MINUTE);
    

Resultado: A data/hora 30 minutos antes de agora.

Exemplos Práticos

  1. Recuperar dados dos últimos 30 dias :
    SELECT * 
    FROM orders
    WHERE order_date > DATE_SUB(CURDATE(), INTERVAL 30 DAY);
    
  1. Excluir dados com mais de 90 dias :
    DELETE FROM logs
    WHERE log_date < DATE_SUB(CURDATE(), INTERVAL 90 DAY);
    
  1. Notificação de lembrete : Defina um lembrete 1 dia antes do início de um evento.
    SELECT event_name, DATE_SUB(event_date, INTERVAL 1 DAY) AS reminder_date
    FROM events;
    
  1. Cálculo de turno : Calcular 3 horas antes do horário de início de um turno.
    SELECT DATE_SUB(shift_start, INTERVAL 3 HOUR) AS preparation_time
    FROM work_shifts;
    

Observações

  • Manipulação de datas inválidas : Se o resultado da subtração se tornar uma data inválida, o MySQL pode retornar NULL. É importante validar a data original.
  • Impacto do fuso horário : Se as configurações de fuso horário do servidor diferirem, os resultados de DATE_SUB podem mudar inesperadamente. Use CONVERT_TZ() quando necessário.

DATE_SUB é tão importante quanto DATE_ADD para operações de data no MySQL. Ao manter a lógica de subtração concisa, você pode melhorar a eficiência na gestão e análise de dados. Na próxima seção, explicaremos 5. Detalhes da Cláusula INTERVAL e Como Usá‑la.

5. Detalhes da Cláusula INTERVAL e Como Usá‑la

A cláusula INTERVAL é usada em operações de data/hora no MySQL, tipicamente junto com DATE_ADD e DATE_SUB, para adicionar ou subtrair uma duração. Esta seção explica a cláusula INTERVAL em detalhes, desde o básico até o uso avançado.

Fundamentos da Cláusula INTERVAL

A cláusula INTERVAL especifica quanto tempo adicionar ou subtrair de uma data alvo. É frequentemente usada com DATE_ADD e DATE_SUB, permitindo operações de data poderosas com sintaxe concisa.

Sintaxe básica:

SELECT date + INTERVAL value unit;
SELECT date - INTERVAL value unit;
  • date : A data ou datetime a ser operada.
  • value : O valor numérico a ser adicionado ou subtraído.
  • unit : A unidade da operação (ex.: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

Unidades Disponíveis

As unidades a seguir podem ser usadas na cláusula INTERVAL.

UnitDescription
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
WEEKWeeks
MONTHMonths
QUARTERQuarters
YEARYears
SECOND_MICROSECONDSeconds and microseconds
MINUTE_MICROSECONDMinutes and microseconds
MINUTE_SECONDMinutes and seconds
HOUR_MICROSECONDHours and microseconds
HOUR_SECONDHours and seconds
HOUR_MINUTEHours and minutes
DAY_MICROSECONDDays and microseconds
DAY_SECONDDays and seconds
DAY_MINUTEDays and minutes
DAY_HOURDays and hours
YEAR_MONTHYears and months

Exemplos Básicos

  1. Adicionar 1 dia a uma data :
    SELECT '2025-01-01' + INTERVAL 1 DAY;
    

Resultado: 2025-01-02

  1. Subtrair 3 horas de um datetime :
    SELECT '2025-01-01 12:00:00' - INTERVAL 3 HOUR;
    

Resultado: 2025-01-01 09:00:00

  1. Subtrair 10 minutos do datetime atual :
    SELECT NOW() - INTERVAL 10 MINUTE;
    
  1. Calcular o primeiro dia do próximo mês a partir do final do mês :
    SELECT LAST_DAY('2025-01-01') + INTERVAL 1 DAY;
    

Resultado: O 1º dia do próximo mês.

Exemplos Avançados

  1. Cálculo de intervalo de datas Calcular o intervalo dos últimos 30 dias.
    SELECT *
    FROM orders
    WHERE order_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE();
    
  1. Calcular a data de início do próximo trimestre
    SELECT '2025-01-01' + INTERVAL 1 QUARTER;
    

Resultado: A data de início do próximo trimestre.

  1. Cálculo de tempo consciente de fuso horário Obter o datetime uma hora depois calculado no fuso horário padrão do servidor.
    SELECT CONVERT_TZ(NOW(), 'SYSTEM', '+09:00') + INTERVAL 1 HOUR;
    
  1. Realizar um cálculo mais complexo Calcule a data duas semanas a partir de hoje e, em seguida, obtenha o último dia desse mês.
    SELECT LAST_DAY(CURDATE() + INTERVAL 14 DAY);
    

Observações

  1. Esteja atento ao tipo de resultado O resultado de um cálculo INTERVAL preserva o tipo original (DATE ou DATETIME). Manipule os tipos de dados corretamente.
  2. Comportamento no final do mês Ao adicionar/subtrair no final do mês, o MySQL pode ajustar para o final ou início do próximo mês. Por exemplo, adicionar 1 mês a 2025-01-31 resulta em 2025-02-28 (ano não bissexto).
  3. Impacto do fuso horário Se fusos horários diferentes estiverem configurados no servidor e no cliente, os cálculos de data/hora podem mudar inesperadamente.

A cláusula INTERVAL é uma ferramenta fundamental para simplificar as operações de data no MySQL. Graças à sua flexibilidade, você pode lidar com cálculos de data complexos com facilidade. Na próxima seção, explicaremos 6. Exemplos Práticos.

6. Exemplos Práticos

Usar a função DATE_ADD do MySQL e a cláusula INTERVAL torna os cálculos de data complexos e o processamento dinâmico simples. Esta seção apresenta vários exemplos práticos que são úteis no trabalho real.

1. Extraindo Dados Dentro de um Período Específico

Na análise de dados e relatórios, é comum extrair registros dentro de um intervalo de tempo específico.

Exemplo 1: Recuperar dados de vendas dos últimos 30 dias

SELECT *
FROM sales
WHERE sale_date >= CURDATE() - INTERVAL 30 DAY;

Explicação: Extrai dados a partir da data que é 30 dias antes de hoje.

Exemplo 2: Recuperar dados do mês anterior

SELECT *
FROM orders
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();

Explicação: Recupera dados de pedidos do mês anterior.

2. Definindo Lembretes de Eventos

Você pode definir notificações de lembrete com base nas datas de início ou prazos de eventos.

Exemplo: Enviar uma notificação 3 dias antes do início de um evento

SELECT event_name, DATE_SUB(event_date, INTERVAL 3 DAY) AS reminder_date
FROM events;

Explicação: Calcula a data 3 dias antes da data do evento e a define como a data de notificação.

3. Gerenciando Datas de Expiração

Calcular datas de expiração com base na data de registro é usado em muitas aplicações.

Exemplo 1: Calcular uma data de expiração 30 dias após o registro

SELECT user_id, registration_date, DATE_ADD(registration_date, INTERVAL 30 DAY) AS expiry_date
FROM users;

Explicação: Calcula uma data de expiração 30 dias após a data de registro.

Exemplo 2: Excluir dados expirados

DELETE FROM sessions
WHERE expiry_date < NOW();

Explicação: Exclui dados de sessão que expiraram com base na data/hora atual.

4. Cálculos de Turnos e Horários

Exemplos de ajuste de horários com base nos tempos de início ou fim de escalas de trabalho.

Exemplo: Calcular 1 hora antes do início de um turno

SELECT shift_id, shift_start, DATE_SUB(shift_start, INTERVAL 1 HOUR) AS preparation_time
FROM shifts;

Explicação: Calcula 1 hora antes do horário de início do turno e o exibe como tempo de preparação.

5. Cálculos Combinando Múltiplos INTERVALs

Exemplos de combinação de múltiplas durações em cálculos.

Exemplo 1: Obter o último dia do mês um mês a partir de hoje

SELECT LAST_DAY(CURDATE() + INTERVAL 1 MONTH);

Explicação: Calcula o último dia do mês um mês após hoje.

Exemplo 2: Adicionar um período de carência de 3 meses após 1 ano do registro

SELECT user_id, DATE_ADD(DATE_ADD(registration_date, INTERVAL 1 YEAR), INTERVAL 3 MONTH) AS final_deadline
FROM users;

Explicação: Calcula um prazo final adicionando 1 ano e, em seguida, mais 3 meses à data de registro.

6. Limpeza e Otimização de Dados

Exemplos de otimização de um banco de dados excluindo dados antigos.

Exemplo: Excluir usuários que não fizeram login nos últimos 90 dias

DELETE FROM user_activity
WHERE last_login < CURDATE() - INTERVAL 90 DAY;

Explicação: Exclui usuários cujo último login é mais antigo que 90 dias a partir de hoje.

Notas

  • Validar resultados de cálculo : Preste atenção especial a casos de borda como fim de mês e anos bissextos.
  • Garantir consistência de tipo de dados : Especificar tipos corretos de data/hora (DATE, DATETIME, etc.) ajuda a prevenir erros.
  • Considerar fusos horários : Quando operar em diferentes fusos horários, use a função CONVERT_TZ().

Aplicando DATE_ADD e a cláusula INTERVAL, você pode otimizar eficientemente as operações de data no trabalho real. Na próxima seção, explicaremos 7. Notas e Melhores Práticas em detalhes.

7. Notas e Melhores Práticas

Operações de data no MySQL são extremamente úteis, mas ao usá‑las no trabalho real você precisa entender vários pontos‑chave e melhores práticas. Esta seção explica o que observar e como usar operações de data de forma eficiente.

Notas

1. Consistência de Tipo de Dados

  • Problema : No MySQL, os resultados podem diferir dependendo do tipo de dado usado para operações de data/hora (DATE, DATETIME, TIMESTAMP, etc.).
  • Exemplo :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY); -- Valid operation
    SELECT DATE_ADD('Invalid Date', INTERVAL 1 DAY); -- Returns NULL for an invalid date
    
  • Contramedida : Valide que os dados de entrada estejam no formato correto antecipadamente, e escolha tipos de dados apropriados.

2. Manipulação de Datas Inválidas

  • Problema : Cálculos envolvendo fim de mês ou anos bissextos podem gerar casos de borda complicados.
  • Exemplo :
    SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH); -- Result: 2025-02-28
    

Neste caso, o MySQL ajusta automaticamente, mas o resultado pode diferir do que você pretendia.

  • Contramedida : Ao lidar com datas de fim de mês, verifique usando a função LAST_DAY().
    SELECT LAST_DAY('2025-01-31') + INTERVAL 1 MONTH;
    

3. Considerações de Fuso Horário

  • Problema : Se o fuso horário do servidor difere do fuso horário da aplicação, podem ocorrer inconsistências de dados ou resultados inesperados.
  • Exemplo :
    SELECT NOW(); -- Depends on the server timezone
    
  • Contramedida : Defina o fuso horário explicitamente.
    SELECT CONVERT_TZ(NOW(), 'SYSTEM', '+09:00'); -- Convert to Japan time
    

4. Desempenho em Cálculos Complexos

  • Problema : Consultas com cálculos de data complexos podem impactar a velocidade de execução.
  • Contramedida : Reduza cálculos desnecessários e otimize consultas usando índices.

Melhores Práticas

1. Use Formatos Padrão

  • Mantenha os formatos de data consistentes.
  • Formatos recomendados: YYYY-MM-DD (DATE), YYYY-MM-DD HH:MM:SS (DATETIME).
  • Exemplo :
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
    

2. Combine Funções Eficazmente

  • Combinar DATE_ADD/DATE_SUB com LAST_DAY ou CURDATE permite cálculos mais flexíveis.
  • Exemplo :
    SELECT LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
    

3. Planeje Operações de Data Dinâmicas Cuidadosamente

  • Ao trabalhar com datas dinâmicas, divida as consultas e processe‑as passo a passo.
  • Exemplo :
    SET @next_month = DATE_ADD(CURDATE(), INTERVAL 1 MONTH);
    SELECT LAST_DAY(@next_month);
    

4. Gerencie Fusos Horários com Segurança

  • Mantenha os fusos horários consistentes entre servidor e cliente.
  • Exemplo :
    SET time_zone = '+09:00';
    

5. Valide em um Ambiente de Teste

  • Teste cálculos de data complexos e cálculos em diferentes fusos horários com antecedência.

Evite Armadilhas Comuns em Operações de Data

Operações de data são uma habilidade importante que pode afetar significativamente o design de bancos de dados e a precisão de consultas. Ao entender as armadilhas e seguir as melhores práticas, você pode prevenir problemas e alcançar um manuseio de dados eficiente.

8. FAQ

Aqui estão perguntas frequentes (FAQ) sobre operações de data no MySQL. Estas respostas focam em pontos comuns que usuários iniciantes a intermediários costumam se perguntar.

Q1: Qual é a diferença entre DATE_ADD e usar o operador + com INTERVAL?

A1:

  • DATE_ADD() é uma função dedicada para cálculos de datas e oferece melhor tratamento de erros e conversão de tipos.
  • + INTERVAL é mais simples, mas erros de conversão de tipo podem ocorrer em alguns casos.

Exemplo: Usando DATE_ADD:

SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY);

Exemplo: Usando o operador + com INTERVAL:

SELECT '2025-01-01' + INTERVAL 1 DAY;

Em geral, recomenda‑se usar DATE_ADD().

Q2: O DATE_ADD pode adicionar múltiplos intervalos ao mesmo tempo?

A2:
Não. DATE_ADD() só pode especificar um intervalo por vez. Contudo, você pode aninhar várias chamadas a DATE_ADD() para obter o mesmo efeito.

Exemplo: Adicionar múltiplos intervalos:

SELECT DATE_ADD(DATE_ADD('2025-01-01', INTERVAL 1 DAY), INTERVAL 1 MONTH);

Q3: Como posso mudar o formato de data no MySQL?

A3:
Use a função DATE_FORMAT() para formatar uma data/hora da maneira que desejar.

Exemplo: Conversão de formato:

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;

Resultado: 2025-01-01 12:30:45

Q4: O que acontece se eu adicionar 1 mês a uma data de fim de mês?

A4:
O MySQL ajusta automaticamente, e o resultado passa a ser o último dia do mês seguinte.

Exemplo:

SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);

Resultado: 2025-02-28

Esse comportamento é conveniente, mas você deve confirmar se corresponde à lógica que pretende.

Q5: Como faço cálculos de data sensíveis ao fuso horário?

A5:
Use a função CONVERT_TZ() do MySQL para especificar o fuso horário.

Exemplo: Converter de UTC para horário do Japão:

SELECT CONVERT_TZ('2025-01-01 12:00:00', 'UTC', '+09:00') AS japan_time;

Q6: O que acontece se uma data inválida for especificada no DATE_ADD?

A6:
Se uma data inválida (por exemplo, 2025-02-30) for especificada, o MySQL retorna NULL.

Exemplo:

SELECT DATE_ADD('2025-02-30', INTERVAL 1 DAY);

Resultado: NULL

Recomenda‑se validar as entradas antes.

Q7: Como posso definir condições baseadas em datas passadas ou futuras?

A7:
Use DATE_ADD ou DATE_SUB para calcular uma data de referência e então utilize esse resultado na cláusula WHERE.

Exemplo: Recuperar dados dos últimos 30 dias:

SELECT * 
FROM sales
WHERE sale_date >= CURDATE() - INTERVAL 30 DAY;

Q8: Quais são as boas práticas ao usar múltiplos fusos horários?

A8:

  • Armazene todos os dados de data/hora em UTC.
  • Converta para o fuso horário necessário no lado do cliente, conforme necessário.

Exemplo: Salvar dados em UTC:

SET time_zone = '+00:00';

Q9: Posso manipular datas e horas separadamente no MySQL?

A9:
Sim. Use DATE() ou TIME() para extrair, respectivamente, a parte de data ou de hora.

Exemplo 1: Extrair apenas a data:

SELECT DATE(NOW());

Exemplo 2: Extrair apenas a hora:

SELECT TIME(NOW());

Q10: Posso usar unidades que não são suportadas pela cláusula INTERVAL do MySQL?

A10:
O MySQL suporta um conjunto fixo de unidades de INTERVAL. Se precisar de outra unidade, converta‑a para uma unidade suportada apropriada.

9. Summary

Operações de data no MySQL são uma habilidade crucial para o design e a operação de bancos de dados. Ao usar DATE_ADD, DATE_SUB e a cláusula INTERVAL, você pode realizar cálculos de data complexos de forma fácil e eficiente.

Key Takeaways

  1. Fundamentos dos tipos de data/hora :
  • No MySQL, é necessário usar corretamente tipos de data/hora como DATE, DATETIME e TIMESTAMP.
  1. DATE_ADD e DATE_SUB :
  • Funções convenientes para adicionar ou subtrair datas, com operações flexíveis usando sintaxe simples.
  1. Cláusula INTERVAL :
  • Uma ferramenta essencial para cálculos de data eficientes usando unidades como anos, meses, dias e horas.
  1. Exemplos práticos :
  • Úteis para diversos casos de uso, como extrair dados passados/futuros, gerenciar datas de expiração e definir lembretes.
  1. Observações e boas práticas :
  • (continua…)

  • É importante entender considerações como consistência de tipos de dados, impacto de fusos horários e ajustes de fim de mês.

  1. FAQ :
  • Forneceu soluções concretas para perguntas e problemas comuns que iniciantes costumam enfrentar.

Próximos passos

  • Aplique o que aprendeu :
  • Experimente usar DATE_ADD e DATE_SUB em seu próprio projeto para praticar operações de data.
  • Projete com fusos horários em mente :
  • Em bancos de dados que operam em múltiplos fusos horários, a gestão precisa de fusos horários e cálculos de datas são críticos.
  • Otimização adicional :
  • Projete consultas eficientes e use índices com desempenho em mente para melhores operações de dados.

Dominar as operações de data no MySQL melhorará muito a eficiência de gerenciar e analisar dados. Use este artigo como referência e aplique ativamente essas habilidades práticas em seu trabalho.