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:45pro começo do dia. O resultado vai ser2023-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
TIMESTAMPou o resultado de outra função, tipoNOW().
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.
GO TO FULL VERSION