Datas e horários não são só números aleatórios, mas sim a chave pra uma parte valiosa da informação dos dados. No mundo real, você sempre tromba com datas: tipo, analisar vendas por mês, filtrar por data de nascimento dos funcionários ou comparar intervalos de tempo. Saber como mexer com datas te deixa criar queries mais flexíveis e fazer análises mais cabulosas.
Exemplos onde trabalhar com datas é super importante:
- Análise de vendas em um mês específico.
- Contar quantos usuários se registraram no último ano.
- Montar relatórios por intervalos de tempo (tipo, receita mensal).
No PostgreSQL tem um monte de função pra lidar com datas, mas agora vamos ver só as mais úteis.
Funções principais pra trabalhar com datas e horários
Função NOW() retorna a data e hora atual do servidor do banco de dados. Você usa quando precisa saber o horário exato agora. Por exemplo: quer gravar o momento em que um novo registro foi criado.
SELECT NOW();
Exemplo de resultado:
2023-11-05 15:23:45.123456+00
Exemplo de uso: Você quer inserir um pedido com a data e hora atual:
INSERT INTO orders (order_id, order_date, total_amount)
VALUES (1, NOW(), 150.00);
Comentário: aqui
NOW() vai colocar automaticamente a data e hora atual na coluna
order_date.
Como exatamente funciona o operador INSERT você vai descobrir nas próximas aulas :P
Função CURRENT_DATE
Se você só precisa da data de hoje sem se importar com o horário, usa CURRENT_DATE. Ela retorna só ano, mês e dia.
Sintaxe:
SELECT CURRENT_DATE;
Exemplo de resultado:
2023-11-05
Exemplo de uso: Digamos que você quer pegar os registros do dia de hoje:
SELECT *
FROM orders
WHERE order_date = CURRENT_DATE;
Comentário: aqui a gente compara a data da coluna
order_date com a data de hoje.
Bora colocar um pouco de humor. NOW() é tipo aquele café no trampo: pronto pra você na hora. Já CURRENT_DATE é tipo o calendário na parede: só a data, sem firula.
Extraindo partes da data com DATE_PART()
A função DATE_PART() deixa a gente pegar uma parte específica da data, tipo ano, mês, dia, hora ou minuto. Isso é útil, por exemplo, pra contar quantos pedidos rolaram em um ano ou descobrir o dia da semana.
Sintaxe:
DATE_PART('parte', data)
Exemplo:
SELECT DATE_PART('year', NOW()) AS current_year;
Exemplo de resultado:
| current_year |
|---|
| 2025 |
Partes da data que você pode extrair:
year: ano.month: mês.day: dia.hour: hora.minute: minuto.second: segundo.dow: dia da semana (0 = domingo).
Exemplo 2: Vamos pegar o mês da data atual.
SELECT DATE_PART('month', CURRENT_DATE) AS current_month;
Resultado:
| current_month |
|---|
| 6 |
Dá pra usar DATE_PART() pra cálculos mais complexos. Por exemplo:
Você quer selecionar só os usuários que nasceram no ano atual:
SELECT *
FROM students
WHERE DATE_PART('year', birth_date) = DATE_PART('year', CURRENT_DATE);
Exemplo de resultado:
| id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 1 | Otto | Art | 2025-03-12 | 9 |
| 2 | Anna | Pal | 2025-07-08 | 8 |
| 3 | Piu | Wolf | 2025-01-22 | 10 |
| 4 | Eva | Go | 2025-09-30 | 7 |
| 5 | Dan | Sok | 2025-06-14 | 9 |
Exemplos práticos
Em alguns exemplos vão aparecer operadores que você ainda não estudou. Relaxa, logo você vai tirar esses exemplos de letra. Quero só te mostrar mais exemplos reais do dia a dia. E dar aquela curiosidade :)
Exemplo 1: Descobrindo a idade do usuário
Imagina que temos uma tabela users com a data de nascimento de cada usuário. Queremos calcular a idade deles.
Query:
SELECT user_id, first_name, last_name,
DATE_PART('year', CURRENT_DATE) - DATE_PART('year', birth_date) AS age
FROM users;
A gente só subtrai o ano da data atual pelo ano de nascimento. É um jeito rápido, mas não é o mais preciso pra idade.
Exemplo de resultado:
| user_id | first_name | last_name | age |
|---|---|---|---|
| 101 | Alex | Lin | 25 |
| 102 | Maria | Chi | 30 |
| 103 | Tor | Coz | 22 |
| 104 | Nat | Ive | 27 |
| 105 | Don | Sok | 35 |
Exemplo 2: Filtrando por horário
Se você quiser pegar todos os pedidos feitos na última hora:
SELECT *
FROM orders
WHERE order_date >= NOW() - INTERVAL '1 hour';
Olha como é prático usar INTERVAL (intervalo de tempo).
Exemplo 3: Agrupando por mês
Você quer contar quantos pedidos rolaram em cada mês do ano atual:
SELECT DATE_PART('month', order_date) AS order_month, COUNT(*) AS order_count
FROM orders
WHERE DATE_PART('year', order_date) = DATE_PART('year', CURRENT_DATE)
GROUP BY DATE_PART('month', order_date)
ORDER BY order_month;
Aqui a gente agrupa pelo número do mês e ordena pelo mesmo número.
Exemplo de resultado:
| order_month | order_count |
|---|---|
| 1 | 120 |
| 2 | 95 |
| 3 | 134 |
| 4 | 110 |
| 5 | 42 |
Exemplo 4: Pegando o dia da semana
Você quer saber em qual dia da semana rola mais pedidos:
SELECT DATE_PART('dow', order_date) AS day_of_week, COUNT(*) AS order_count
FROM orders
GROUP BY DATE_PART('dow', order_date)
ORDER BY order_count DESC;
O comando DATE_PART('dow') retorna o dia da semana de cada pedido como número, onde 0 é domingo, 1 é segunda, e por aí vai. DOW é abreviação de DayOfWeek - dia da semana.
Exemplo de resultado:
| day_of_week | order_count |
|---|---|
| 5 | 210 |
| 4 | 190 |
| 3 | 175 |
| 2 | 160 |
| 1 | 140 |
| 6 | 120 |
| 0 | 95 |
Fica ligado nos erros comuns
Mexer com datas às vezes dá dor de cabeça por causa de erro. Aqui vão alguns problemas comuns que podem aparecer:
Formato de data e hora: quando você usa NOW() ou qualquer função que retorna data com hora, sempre confere o formato. Por exemplo, se comparar order_date com CURRENT_DATE, garante que o horário vai ser ignorado ou especificado certinho.
Data como string: muitas vezes no banco as datas ficam salvas como texto (tipo, string). Se tentar usar funções de data (tipo DATE_PART()), vai dar erro. Confere se o campo é do tipo DATE ou TIMESTAMP.
Fusos horários diferentes: se seu servidor tá numa timezone e os dados vêm de outra, pode dar confusão. Pensa em usar o tipo TIMESTAMPTZ pra timezone.
GO TO FULL VERSION