Um ‘interval’ no PostgreSQL representa uma duração de tempo. Ele pode ser o resultado da subtração de dois valores TIMESTAMP ou ser definido explicitamente com a palavra-chave INTERVAL.
Veja um exemplo:
SELECT INTERVAL '2 days 3 hours 40 minutes' AS example_interval;
Saída esperada:
example_interval
-------------------
2 days 03:40:00
Extraindo dias, horas e minutos
Extraindo dias
Para extrair o número total de dias de um intervalo:
SELECT EXTRACT(DAY FROM INTERVAL '5 days 4 hours 30 minutes') AS total_days;
Saída esperada:
total_days
------------
5
Extraindo horas
Ao extrair horas, a função EXTRACT retorna apenas o componente de hora do intervalo, e não o total de horas incluindo os dias. Por exemplo:
SELECT EXTRACT(HOUR FROM INTERVAL '2 days 4 hours 30 minutes') AS hours_component;
Saída esperada:
hours_component
-----------------
4
Para obter o total de horas, incluindo os dias, você precisa fazer um pouco de aritmética:
SELECT EXTRACT(DAY FROM INTERVAL '2 days 4 hours 30 minutes') * 24 +
EXTRACT(HOUR FROM INTERVAL '2 days 4 hours 30 minutes') AS total_hours;
Saída esperada:
total_hours
------------
52
Extraindo minutos
Assim como as horas, extrair os minutos retorna apenas a parte de minutos do intervalo:
SELECT EXTRACT(MINUTE FROM INTERVAL '2 days 4 hours 30 minutes') AS minutes_component;
Saída esperada:
minutes_component
-------------------
30
Para obter o total de minutos do intervalo, você pode calcular:
SELECT (EXTRACT(DAY FROM INTERVAL '2 days 4 hours 30 minutes') * 24 * 60) +
(EXTRACT(HOUR FROM INTERVAL '2 days 4 hours 30 minutes') * 60) +
EXTRACT(MINUTE FROM INTERVAL '2 days 4 hours 30 minutes') AS total_minutes;
Saída esperada:
total_minutes
---------------
3150
Exemplos práticos
Vamos ver um exemplo prático usando uma tabela. Suponha que temos uma tabela chamada events que armazena os timestamps de início e fim de vários eventos:
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
start_time TIMESTAMP,
end_time TIMESTAMP
);
INSERT INTO events (start_time, end_time)
VALUES
('2024-08-01 08:00:00', '2024-08-03 12:30:00'),
('2024-08-05 09:15:00', '2024-08-05 18:45:00');
Podemos calcular o intervalo de cada evento e extrair o total de dias, horas e minutos:
SELECT
event_id,
end_time - start_time AS duration,
EXTRACT(DAY FROM end_time - start_time) AS total_days,
(EXTRACT(DAY FROM end_time - start_time) * 24 +
EXTRACT(HOUR FROM end_time - start_time)) AS total_hours,
(EXTRACT(DAY FROM end_time - start_time) * 24 * 60 +
EXTRACT(HOUR FROM end_time - start_time) * 60 +
EXTRACT(MINUTE FROM end_time - start_time)) AS total_minutes
FROM events;
Saída esperada:
event_id | duration | total_days | total_hours | total_minutes
---------+---------------+------------+-------------+--------------
1 | 2 days 04:30 | 2 | 52 | 3150
2 | 09:30:00 | 0 | 9 | 570
Conclusão
Extrair dias, horas ou minutos de um intervalo no PostgreSQL é simples com a função EXTRACT. Para obter totais, você precisará combinar EXTRACT com operações aritméticas. Essas técnicas são muito úteis para analisar dados baseados em tempo nas suas aplicações.
Outros artigos que você pode gostar:
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com SQL. É rápido, intuitivo e torna o trabalho com banco de dados agradável de novo."
"Já testei muitas GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."