CodeGym /Cursos /SQL SELF /Formatação de datas e horários: NOW(),

Formatação de datas e horários: NOW(), CURRENT_DATE, DATE_PART()

SQL SELF
Nível 5 , Lição 2
Disponível

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.

Sintaxe:
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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION