CodeGym /Cursos /SQL SELF /Arredondando e cortando dados temporais: DATE_TRUN...

Arredondando e cortando dados temporais: DATE_TRUNC()

SQL SELF
Nível 32 , Lição 0
Disponível

DATE_TRUNC() é uma ferramenta poderosa que te deixa cortar valores de data/hora até uma unidade de tempo específica. Por exemplo, dá pra arredondar um timestamp pro começo do dia, mês, ano, hora e assim por diante. Isso é super útil quando você quer analisar dados por períodos (tipo, se precisa agrupar pedidos por dia, mês ou ano).

Pensa numa data e hora como uma string grandona, onde tem horas, minutos, segundos. A função DATE_TRUNC() pega essa string e "corta" o que não interessa, deixando só a parte que você quer. Por exemplo:

  • Você quer cortar a data 2023-10-01 15:30:45 pro começo do dia. O resultado vai ser 2023-10-01 00:00:00.
  • Ou você quer deixar só o primeiro segundo da hora, tipo 2023-10-01 15:00:00.

Sintaxe

A sintaxe da função DATE_TRUNC() é assim:

DATE_TRUNC(field, source)
  • field — é a unidade de tempo até onde você quer "cortar" a data. Tipo year, month, day, hour, minute.
  • source — é o valor temporal que você quer cortar. Pode ser uma coluna do tipo TIMESTAMP ou o resultado de outra função, tipo NOW().

Exemplo de chamada simples:

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- Resultado: 2023-10-01 00:00:00

Unidades suportadas

Aqui vai uma lista de algumas unidades de tempo que você pode usar no DATE_TRUNC():

Unidade de tempo Descrição
year Começo do ano (tipo, 2023-01-01 00:00:00)
quarter Começo do trimestre (tipo, 2023-07-01 00:00:00)
month Começo do mês (tipo, 2023-10-01 00:00:00)
week Começo da semana* (tipo, 2023-09-25 00:00:00)
day Começo do dia (tipo, 2023-10-01 00:00:00)
hour Começo da hora (tipo, 2023-10-01 15:00:00)
minute Começo do minuto (tipo, 2023-10-01 15:30:00)
second Começo do segundo (tipo, 2023-10-01 15:30:45)

Quanto menor a unidade de tempo, mais preciso vai ser o corte. Ah, e a semana começa no domingo :)

Exemplos de uso do DATE_TRUNC()

Cortando pro começo do dia. Nesse exemplo, a gente pega um timestamp e arredonda pro começo do dia:

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- Resultado: 2023-10-01 00:00:00

Cortando pro começo do mês. Agora vamos cortar a data pro começo do mês:

SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- Resultado: 2023-10-01 00:00:00

Cortando pro começo do ano. Vamos arredondar a data pro começo do ano:

SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- Resultado: 2023-01-01 00:00:00

Usando com o tempo atual (NOW()). Se você sempre quer trabalhar com a data e hora atual, dá pra combinar DATE_TRUNC() e NOW():

SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- O resultado depende do horário atual, tipo: 2023-10-01 15:00:00

Agrupando pedidos por mês. Agora vamos pra um exemplo mais prático. Imagina que você tem uma tabela de pedidos, e cada registro tem a data do pedido. Quer contar quantos pedidos rolaram em cada mês:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date TIMESTAMP NOT NULL
);

INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');

SELECT DATE_TRUNC('month', order_date) AS order_month,
       COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;

Resultado:

order_month total_orders
2023-08-01 00:00 2
2023-09-01 00:00 1
2023-10-01 00:00 2

Casos práticos de uso

Análise de dados temporais por períodos: quer saber quantos usuários se registraram por ano, mês ou dia? Usa o DATE_TRUNC() pra agrupar os dados.

Montando relatórios: arredondar o timestamp do jeito certo deixa os relatórios muito mais fáceis de ler.

Comparando data e hora: se você tem dados temporais super precisos (tipo, com milissegundos), corta eles pro nível que você precisa pra comparar direitinho.

Erros comuns ao usar DATE_TRUNC()

Usar campos não suportados. Por exemplo, o campo millisecond não é suportado, e se tentar usar vai dar erro.

Tipo de dado errado. A função DATE_TRUNC() só funciona com tipos temporais, tipo TIMESTAMP. Se passar uma string, vai dar erro.

Erro de arredondamento. Lembra que o DATE_TRUNC() sempre corta pro começo da unidade de tempo que você pediu. Se quiser arredondar de outro jeito, tem que usar outras técnicas.

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