⏳ Últimos dias de outubro! O SQLtest.online é gratuito graças às doações, e ainda precisamos atingir a meta deste mês para manter o site funcionando em novembro. Cada doação conta. Apoiar agora →
Código SQL copiado para a área de transferência

Funções de Data e Hora em SQL

Lição 3.4 · Tempo de leitura: ~8 min · Tarefas para praticar ↓

As funções de data e hora em SQL devolvem a data atual, extraem partes de uma data, somam e subtraem intervalos, calculam a diferença entre datas e formatam datas para exibição. Nesta lição, você vai aprender as funções mais usadas com exemplos dos dados de aluguel do banco Sakila e ver como os nomes delas mudam entre bancos de dados.

Quase toda tabela de negócio tem datas: quando um pedido foi feito, quando um filme foi alugado, quando um pagamento foi realizado. Perguntas como "quanto tempo durou o aluguel?", "quando o filme deve ser devolvido?" ou "quantos aluguéis houve em julho?" são respondidas com funções de data.

Os exemplos usam a sintaxe do MySQL e do MariaDB. As funções de data variam mais entre bancos de dados do que qualquer outro grupo, por isso há uma tabela comparativa no fim da lição.

Funções de data e hora em SQL: extrair o ano, o mês e o dia de uma data, somar um intervalo com DATE_ADD e DATEDIFF entre duas datas

A Data e a Hora Atuais

ExpressãoDevolveExemplo
CURRENT_DATEA data atual2026-10-16
CURRENT_TIMEA hora atual14:25:30
CURRENT_TIMESTAMP ou NOW()A data e a hora atuais2026-10-16 14:25:30
SELECT CURRENT_DATE AS today,
       CURRENT_TIME AS now_time,
       NOW() AS now_datetime;

Resultado: uma linha com a data, a hora, e a data com hora atuais do servidor de banco de dados.

CURRENT_DATE, CURRENT_TIME e CURRENT_TIMESTAMP são escritos sem parênteses: são expressões do padrão SQL. O valor é fixado no início da instrução, por isso todas as linhas de uma mesma consulta recebem a mesma hora.


Extrair Partes de uma Data

DATE() e TIME() separam um valor de data e hora em data e hora; YEAR(), MONTH() e DAY() devolvem números:

SELECT rental_date,
       DATE(rental_date) AS rental_day,
       TIME(rental_date) AS rental_time,
       YEAR(rental_date) AS rental_year,
       MONTH(rental_date) AS rental_month,
       DAY(rental_date) AS day_of_month
FROM rental
LIMIT 3;

Resultado: para cada um dos três primeiros aluguéis, a data e hora completa dividida em data, hora, ano, mês e dia.

A função padrão EXTRACT() faz o mesmo e funciona na maioria dos bancos de dados:

SELECT rental_date,
       EXTRACT(YEAR FROM rental_date) AS rental_year,
       EXTRACT(MONTH FROM rental_date) AS rental_month
FROM rental
LIMIT 3;

As partes extraídas são úteis em filtros:

SELECT rental_id, rental_date
FROM rental
WHERE YEAR(rental_date) = 2005
  AND MONTH(rental_date) = 7
LIMIT 5;

Resultado: cinco aluguéis feitos em julho de 2005.

Uma função aplicada a uma coluna impede o banco de dados de usar um índice nessa coluna. Em tabelas grandes, um intervalo de datas é mais rápido: WHERE rental_date >= '2005-07-01' AND rental_date < '2005-08-01'. Você vai entender o porquê nas lições sobre índices.


Somar e Subtrair Intervalos

DATE_ADD() e DATE_SUB() deslocam uma data por um intervalo. A unidade pode ser SECOND, MINUTE, HOUR, DAY, WEEK, MONTH ou YEAR.

SELECT rental_id,
       rental_date,
       DATE_ADD(rental_date, INTERVAL 7 DAY) AS due_date,
       DATE_SUB(rental_date, INTERVAL 1 MONTH) AS month_before
FROM rental
LIMIT 3;

Resultado: a data de cada aluguel, a data sete dias depois e a data um mês antes.

MySQL e MariaDB também aceitam a forma curta rental_date + INTERVAL 7 DAY.


A Diferença Entre Duas Datas

DATEDIFF(end, start) devolve o número de dias entre duas datas e ignora a hora:

SELECT rental_id,
       rental_date,
       return_date,
       DATEDIFF(return_date, rental_date) AS days_rented
FROM rental
WHERE return_date IS NOT NULL
LIMIT 5;

Resultado: quantos dias de calendário durou cada um de cinco aluguéis devolvidos.

TIMESTAMPDIFF(unit, start, end) conta unidades completas de qualquer tamanho; repare que a data inicial vem primeiro:

SELECT rental_id,
       TIMESTAMPDIFF(HOUR, rental_date, return_date) AS hours_rented,
       TIMESTAMPDIFF(DAY, rental_date, return_date) AS full_days_rented
FROM rental
WHERE return_date IS NOT NULL
LIMIT 5;

Resultado: a duração do aluguel em horas e em dias completos de 24 horas. full_days_rented pode ser menor que DATEDIFF, que conta dias de calendário.


Formatar Datas

DATE_FORMAT(date, format) transforma uma data em texto no formato indicado:

SELECT rental_date,
       DATE_FORMAT(rental_date, '%d.%m.%Y') AS european_date,
       DATE_FORMAT(rental_date, '%M %e, %Y %H:%i') AS long_date
FROM rental
LIMIT 3;

Resultado: a data como 24.05.2005 e como May 24, 2005 22:53.

EspecificadorSignificadoExemplo
%YAno com 4 dígitos2005
%mMês com 2 dígitos05
%MNome do mêsMay
%d / %eDia com / sem zero à esquerda04 / 4
%H, %i, %sHoras (24 h), minutos, segundos22, 53, 30

O resultado de DATE_FORMAT() é texto, não uma data. Formate datas apenas para exibição; compare e ordene os valores de data originais.


Funções de Data em Outros Bancos de Dados

TarefaMySQL / MariaDBPostgreSQLSQL ServerSQLite
Data e hora atuaisNOW()NOW()GETDATE()datetime('now')
Ano de uma dataYEAR(d)EXTRACT(YEAR FROM d)YEAR(d)strftime('%Y', d)
Somar 7 diasDATE_ADD(d, INTERVAL 7 DAY)d + INTERVAL '7 days'DATEADD(day, 7, d)date(d, '+7 days')
Dias entre datasDATEDIFF(d2, d1)d2::date - d1::dateDATEDIFF(day, d1, d2)julianday(d2) - julianday(d1)
Formatar uma dataDATE_FORMAT(d, '%d.%m.%Y')TO_CHAR(d, 'DD.MM.YYYY')FORMAT(d, 'dd.MM.yyyy')strftime('%d.%m.%Y', d)

EXTRACT(part FROM date) e CURRENT_DATE / CURRENT_TIMESTAMP são padrão e funcionam em quase todos os bancos.


Principais conclusões:

  • CURRENT_DATE, CURRENT_TIMESTAMP e NOW() devolvem a data e a hora atuais.
  • DATE(), YEAR(), MONTH(), DAY() e EXTRACT() extraem partes de uma data.
  • DATE_ADD() e DATE_SUB() deslocam uma data por um intervalo.
  • DATEDIFF() conta dias de calendário; TIMESTAMPDIFF() conta unidades completas de qualquer tamanho.
  • DATE_FORMAT() devolve texto: use-o para exibição, não para comparações.
  • Os nomes das funções de data variam muito entre bancos de dados; consulte a tabela acima ao mudar de banco.

Perguntas Frequentes

Como obter a data atual em SQL?

Use CURRENT_DATE para a data apenas, e CURRENT_TIMESTAMP ou NOW() para a data com hora. No SQL Server, use GETDATE() ou CAST(GETDATE() AS DATE).

Como calcular o número de dias entre duas datas em SQL?

No MySQL e no MariaDB, use DATEDIFF(end_date, start_date). No SQL Server, DATEDIFF(day, start_date, end_date). No PostgreSQL, subtraia uma data da outra: end_date::date - start_date::date.

Como somar dias a uma data em SQL?

No MySQL e no MariaDB, use DATE_ADD(date, INTERVAL 7 DAY) ou date + INTERVAL 7 DAY. No PostgreSQL, date + INTERVAL '7 days'; no SQL Server, DATEADD(day, 7, date).

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Mês com Maior Pagamento
  2. Analise os dados de aluguel do filme
  3. Encontre o tempo médio de atividade do cliente
  4. Conte os atrasos de aluguel
  5. Distribuição de clientes por dia da semana