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.
A Data e a Hora Atuais
| Expressão | Devolve | Exemplo |
|---|---|---|
CURRENT_DATE | A data atual | 2026-10-16 |
CURRENT_TIME | A hora atual | 14:25:30 |
CURRENT_TIMESTAMP ou NOW() | A data e a hora atuais | 2026-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.
| Especificador | Significado | Exemplo |
|---|---|---|
%Y | Ano com 4 dígitos | 2005 |
%m | Mês com 2 dígitos | 05 |
%M | Nome do mês | May |
%d / %e | Dia com / sem zero à esquerda | 04 / 4 |
%H, %i, %s | Horas (24 h), minutos, segundos | 22, 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
| Tarefa | MySQL / MariaDB | PostgreSQL | SQL Server | SQLite |
|---|---|---|---|---|
| Data e hora atuais | NOW() | NOW() | GETDATE() | datetime('now') |
| Ano de uma data | YEAR(d) | EXTRACT(YEAR FROM d) | YEAR(d) | strftime('%Y', d) |
| Somar 7 dias | DATE_ADD(d, INTERVAL 7 DAY) | d + INTERVAL '7 days' | DATEADD(day, 7, d) | date(d, '+7 days') |
| Dias entre datas | DATEDIFF(d2, d1) | d2::date - d1::date | DATEDIFF(day, d1, d2) | julianday(d2) - julianday(d1) |
| Formatar uma data | DATE_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_TIMESTAMPeNOW()devolvem a data e a hora atuais.DATE(),YEAR(),MONTH(),DAY()eEXTRACT()extraem partes de uma data.DATE_ADD()eDATE_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).