Problema:
Você gostaria de agrupar registros por mês em um banco de dados PostgreSQL.
Exemplo:
Nosso banco de dados tem uma tabela chamada
watch
com dados nas colunas id
, name
e production_timestamp
. id | nome | production_timestamp |
---|---|---|
1 | assistir | 2019-03-01 11:45:23 |
2 | relógio inteligente | 2019-09-15 07:35:13 |
3 | banda inteligente | 2019-09-22 17:22:05 |
Solução:
Você pode usar o
DATE_TRUNC()
função para agrupar registros em uma tabela por mês. Aqui está a consulta que você escreveria:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Segue o resultado da consulta:
produção_para_mês | contagem |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Discussão:
Use o
DATE_TRUNC()
função se você deseja recuperar uma data ou hora com uma precisão específica de um banco de dados PostgreSQL. (No nosso exemplo, usamos a precisão do mês.) Esta função recebe dois argumentos. Primeiro, temos o especificador de parte de data (no nosso exemplo, 'mês'). Observe que o especificador é uma string e precisa ser colocado entre aspas.
O segundo argumento é o valor do carimbo de data/hora; pode ser uma expressão que retorna um valor de carimbo de data/hora ou o nome de uma coluna de carimbo de data/hora. (No nosso exemplo, usamos a coluna
production_timestamp
). A função
DATE_TRUNC()
trunca o carimbo de data/hora com a precisão fornecida (neste caso, o mês). Em nosso banco de dados, o smartwatch tem a data de produção 2019-09-15 07:35:13
; depois de truncado para a precisão do mês, torna-se 2019-09-01 00:00:00
. A precisão em nível de mês faz com que o dia seja exibido como '01' e a hora seja preenchida com zeros. (As partes de data truncadas (por exemplo, dias, meses) do carimbo de data/hora são substituídas por outras.) Agrupar registros por mês é muito comum no PostgreSQL. Em nosso exemplo, o número de produtos é totalizado para cada mês. (O
COUNT()
função agregada conta o número de produtos). Se você agrupar registros usando uma função de agregação, deverá usar a cláusula GROUP BY. Após a cláusula GROUP BY, você deve colocar as colunas ou expressões usadas com a função agregada na instrução SELECT. (No nosso exemplo, este é DATE_TRUNC( 'month', production_timestamp)
.) Claro, você não precisa usar o
DATE_TRUNC()
função apenas para agrupar registros. Você também pode usá-lo para obter o primeiro dia do mês para uma determinada data. Para cada relógio, vamos obter o nome e a data de produção com a precisão do mês – sem necessidade de agrupamento. Aqui está a consulta que você escreveria:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Aqui está o resultado:
nome | produção_para_mês |
---|---|
assistir | 2019-03-01 00:00:00 |
relógio inteligente | 2019-09-01 00:00:00 |
banda inteligente | 2019-09-01 00:00:00 |
Nesta consulta, a função
DATE_TRUNC()
trunca o carimbo de data/hora para a precisão do mês. Em nosso banco de dados, o smartwatch tem a data de produção '2019-09-15 07:35:13'
; agora é '2019-09-01 00:00:00'
, que é o primeiro dia do mês.