0Pricing
Coding Interview Prep · Aula

Aritmética de datas e intervalos

Adicionando ou subtraindo períodos e calculando diferenças entre datas.

Aritmética de datas e intervalos é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

Por que os cálculos de datas aparecem nas entrevistas

A aritmética de datas é uma das habilidades mais práticas em SQL, por isso os entrevistadores dão bastante ênfase a ela em vagas de analista e de desenvolvimento de sistemas. Quase toda pergunta de negócio tem um componente temporal: últimos 30 dias, pedidos por semana, dias desde o cadastro.

A dificuldade é que as funções de data são a parte menos padronizada do SQL. A mesma operação tem uma sintaxe diferente no PostgreSQL, no MySQL e no SQL Server. Um candidato preparado apresenta o conceito com clareza e depois adapta a sintaxe ao dialeto.

  • Adicionar ou subtrair um período
  • Calcular a diferença entre duas datas
  • Trabalhar com valores de INTERVAL

O tipo INTERVAL

No PostgreSQL e no padrão SQL, um período de tempo é um valor de primeira classe chamado intervalo. Você o adiciona a uma data ou a um carimbo de data e hora usando os operadores simples + e -.

Essa é a maneira mais clara de expressar "há 30 dias" ou "daqui a 3 meses", e os entrevistadores gostam dela porque a leitura se aproxima da linguagem natural.

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

Adicionando períodos entre dialetos

Os entrevistadores costumam perguntar: "como você adicionaria 7 dias no MySQL e no SQL Server?" Conhecer os três principais dialetos demonstra experiência real.

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL Server: DATEADD(day, 7, d)

O conceito é idêntico; apenas a forma de escrevê-lo muda. Sempre informe o dialeto para o qual você está escrevendo.

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

Diferença entre duas datas

A outra metade da aritmética de datas é calcular a distância entre duas datas. O resultado depende da unidade e do dialeto.

No PostgreSQL, subtrair dois valores date fornece diretamente um número inteiro de dias. Subtrair dois valores timestamp fornece um intervalo.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF e suas armadilhas

DATEDIFF existe no MySQL e no SQL Server, mas se comporta de maneira diferente — uma armadilha clássica de entrevistas.

  • MySQL: DATEDIFF(end, start) retorna apenas dias inteiros.
  • SQL Server: DATEDIFF(unit, start, end) recebe uma unidade e conta passagens pelos limites, não unidades completas.

Esse comportamento de limite é importante: DATEDIFF(year, '2023-12-31', '2024-01-01') no SQL Server retorna 1, embora tenha passado apenas um dia.

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

Como calcular a idade em anos corretamente

"Calcule a idade de um cliente em anos" é uma questão clássica. Dividir ingenuamente a diferença em dias por 365 gera desvios por causa dos anos bissextos. O PostgreSQL tem AGE(), que retorna um intervalo de calendário verdadeiro.

Para obter uma contagem inteira precisa de anos, extraia a parte referente ao ano da idade.

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

Exemplo resolvido: pedidos nos últimos 30 dias

Um filtro quase universal em entrevistas. A maneira correta é comparar a coluna de data com um limite calculado, não aplicar uma função à coluna.

Comparar order_date com um limite constante mantém utilizável qualquer índice sobre order_date. Voltaremos a esse ponto sobre índices mais adiante.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

Intervalos semiabertos para um mês do calendário

Quando pedirem "todos os pedidos de março de 2024", evite BETWEEN '2024-03-01' AND '2024-03-31' em uma coluna de carimbo de data e hora. Isso deixa de fora as linhas das 23h de 31 de março e é propenso a erros de limite.

O padrão robusto é um intervalo semiaberto: >= no início e < no início do mês seguinte. Ele funciona com qualquer precisão da coluna.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT e partes da data

Extrair um único componente de uma data é algo recorrente em trabalhos de relatórios. A função padrão é EXTRACT(part FROM d), compatível com PostgreSQL e MySQL.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) para o dia da semana
  • O SQL Server usa DATEPART(weekday, d) em vez disso

Observação: extrair apenas MONTH agrupa os meses de março de anos diferentes, o que raramente é o que você deseja.

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

Exemplo aprofundado: dias até o próximo aniversário

Um problema mais difícil de aritmética que combina extração e adição. Crie o aniversário deste ano a partir do mês e do dia de nascimento e, se ele já tiver passado, avance para o ano seguinte.

Explicar esse processo em voz alta mostra ao entrevistador que você sabe raciocinar sobre casos extremos, como um aniversário que já ocorreu neste ano.

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

Primeiro e último dia do mês

"Forneça o último dia do mês de cada pedido" testa se você recorre a uma função integrada ou tenta reinventá-la. O PostgreSQL combina DATE_TRUNC com aritmética de intervalos; o MySQL tem LAST_DAY() diretamente.

O truque para obter o último dia no PostgreSQL é truncar até o início do mês, adicionar um mês e subtrair um dia.

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

Verificação rápida

Teste sua compreensão do comportamento das diferenças de datas entre dialetos.

Recapitulação: aritmética de datas e intervalos

Principais conclusões para a entrevista:

  • Use valores de INTERVAL com +/- no PostgreSQL; DATE_ADD/DATEDIFF no MySQL; DATEADD/DATEDIFF no SQL Server.
  • DATEDIFF no SQL Server conta passagens pelos limites, não unidades transcorridas — a principal armadilha.
  • Para calcular a idade em anos, extraia o valor de AGE() em vez de dividir os dias por 365.
  • Filtre as linhas recentes comparando a coluna com um limite calculado e use intervalos semiabertos (>= start AND < next) para períodos mensais.

Apresente primeiro o conceito e depois adapte o dialeto.

Perguntas Frequentes

A aula “Aritmética de datas e intervalos” é grátis?

Sim — o texto completo de “Aritmética de datas e intervalos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Aritmética de datas e intervalos”?

Adicionando ou subtraindo períodos e calculando diferenças entre datas. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Aritmética de datas e intervalos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Coding Interview Prep?

Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Aritmética de datas e intervalos
  2. Truncando e agrupando datas
  3. Analisando e formatando strings
  4. Fusos horários e marcas de data e hora
← Voltar para Coding Interview Prep