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'); -- 1Como 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,DAYEXTRACT(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
INTERVALcom+/-no PostgreSQL;DATE_ADD/DATEDIFFno MySQL;DATEADD/DATEDIFFno 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
- Aritmética de datas e intervalos
- Truncando e agrupando datas
- Analisando e formatando strings
- Fusos horários e marcas de data e hora