Me pergutaram no serviço, como agrupar os resultados de um select por hora, ignorando as informações de minuto/segundo.
Segue abaixo o exemplo de como fazer esse agrupamento:
experiments=# create table test_group_date(count real, date timestamp); CREATE TABLE experiments=# insert into test_group_date(count, date) values (1, TIMESTAMP '2001-02-16 20:38:40'); INSERT 0 1 experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:38:40'); INSERT 0 1 experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:58:40'); INSERT 0 1 experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:59:40'); INSERT 0 1 experiments=# select * from test_group_date; count | date -------+--------------------- 1 | 2001-02-16 20:38:40 2 | 2001-02-16 21:38:40 2 | 2001-02-16 21:58:40 2 | 2001-02-16 21:59:40 (4 rows) experiments=# select sum(count), date_trunc('hour', date) from test_group_date group by date_trunc('hour', date) experiments-# ; sum | date_trunc -----+--------------------- 6 | 2001-02-16 21:00:00 1 | 2001-02-16 20:00:00 (2 rows) experiments=# select agrupado_por_hora.hora, agrupado_por_hora.max_val - agrupado_por_hora.min_val from ( select date_trunc('hour', date) hora, min(date) min_val, max(date) max_val from test_group_date group by date_trunc('hour',date) ) as agrupado_por_hora ; hora | ?column? ---------------------+---------- 2001-02-16 21:00:00 | 00:21:00 2001-02-16 20:00:00 | 00:00:00 (2 rows) experiments=#
Para mais detalhes sobre a função date_trunc e outras funções de data. Acesse a documentação do PostgreSQL.
Note que além da date_trunc existe a função date_part. A diferença é que a date_part retorna apenas o pedaço solicitado (ou seja, apenas a hora ou minuto, etc...).