Problema:
Você deseja obter o dia do ano a partir de uma coluna de data ou timestamp no PostgreSQL.
Exemplo:
Nosso banco de dados tem uma tabela chamada
software_sale
com dados nas colunas id
, software
e sale_date
. id | software | data_venda |
---|---|---|
1 | Superjogo X | 2019-09-15 |
2 | Navegador X | 2019-10-15 |
3 | Notícias DB | 26-11-2019 |
4 | MyPaintSoft | 2018-10-15 |
5 | Novo SO | 2019-10-15 |
Vamos contar o número de itens de software vendidos por dias do ano. Usaremos isso para descobrir em quais dias do ano (independentemente do ano real) as vendas foram altas ou baixas.
Solução 1:
Usaremos o
DATE_PART()
função. Aqui está a consulta que você escreveria:SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Segue o resultado da consulta:
day_of_year | contagem |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Discussão:
Use o PostgreSQL
DATE_PART()
função para recuperar o número do dia de um ano de uma coluna date/time/datetime/timestamp. Esta função recebe dois argumentos. O primeiro argumento é a parte da data (ou parte da hora) que você deseja que a função retorne. Neste exemplo, estamos usando 'doy
’, que retorna o dia do ano. Você pode usar outras partes, como dia, ano, mês, hora, minuto, semana, etc. Você pode aprender mais na documentação do PostgreSQL. O segundo argumento é a data/hora/data/hora da qual você deseja extrair a parte de data/hora. Esta pode ser uma expressão que retorna um valor de data/hora/datahora/carimbo de hora ou o nome de uma coluna de data/hora/datahora/hora. (No nosso exemplo, é uma coluna da data tipo de dados.)
A função
DATE_PART()
com o 'doy
’ identificador retorna o número do dia do ano (de 1 a 365/366) como um inteiro. Em nosso exemplo, o dia do ano da data da venda (do sale_date
column) agora é exibido em uma nova coluna, day_of_year
. O 15 de outubro foi o 288º dia em 2019 e em 2018; nesse dia, ao longo de dois anos, foram realizadas três vendas (2 em 2019, 1 em 2018). Usamos o
COUNT()
função agregada para contar o número de vendas. Esta função recebe um argumento; neste caso, é o número de ID do software. Também precisamos do GROUP BY
cláusula nesta consulta para agrupar registros de acordo com o dia do ano. (No nosso exemplo, o argumento real é day_of_year
, o alias para DATE_PART('doy',sale_date)
.) Esta não é a única maneira de obter o dia do ano. Também podemos usar o
EXTRACT()
função. Solução 2:
Aqui está a consulta que você escreveria com o
EXTRACT()
função:SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Esta função é semelhante a
DATE_PART()
. A diferença é que usamos FROM em vez de uma vírgula entre o identificador da parte da data e o argumento de data e hora. O resultado é o mesmo. Nota:EXTRACT()
é padrão SQL.