Problema:
Vuoi ottenere il giorno dell'anno da una colonna data o timestamp in PostgreSQL.
Esempio:
Il nostro database ha una tabella denominata software_sale
con i dati nelle colonne id
, software
e sale_date
.
id | software | data_di_vendita |
---|---|---|
1 | Super Game X | 15-09-2019 |
2 | Browser X | 15-10-2019 |
3 | Notizie DB | 26-11-2019 |
4 | MyPaintSoft | 15-10-2018 |
5 | Nuovo sistema operativo | 15-10-2019 |
Contiamo il numero di articoli software venduti per giorni dell'anno. Lo useremo per scoprire in quali giorni dell'anno (indipendentemente dall'anno effettivo) le vendite sono state alte o basse.
Soluzione 1:
Useremo il DATE_PART()
funzione. Ecco la domanda che scriveresti:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Ecco il risultato della query:
giorno_dell'anno | conta |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Discussione:
Usa il DATE_PART()
di PostgreSQL funzione per recuperare il numero del giorno di un anno da una colonna data/ora/dataora/data/ora. Questa funzione accetta due argomenti. Il primo argomento è la parte della data (o della parte temporale) che si desidera venga restituita dalla funzione. In questo esempio, stiamo usando "doy
', che restituisce il giorno dell'anno. Puoi usare altre parti, come giorno, anno, mese, ora, minuti, settimana, ecc. Puoi saperne di più nella documentazione di PostgreSQL.
Il secondo argomento è la data/ora/dataora/data/ora da cui si desidera estrarre la parte data/ora. Può essere un'espressione che restituisce un valore di data/ora/data/ora/data/ora o il nome di una colonna data/ora/data/ora/data/ora. (Nel nostro esempio, è una colonna della data tipo di dati.)
La funzione DATE_PART()
con il 'doy
' identificatore restituisce il numero del giorno dell'anno (da 1 a 365/366) come intero. Nel nostro esempio, il giorno dell'anno della data di vendita (da sale_date
colonna) viene ora visualizzato in una nuova colonna, day_of_year
. Il 15 ottobre è stata la 288a giornata nel 2019 e nel 2018; in quel giorno nell'arco di due anni sono state effettuate in totale tre vendite (2 nel 2019, 1 nel 2018).
Usiamo il COUNT()
funzione aggregata per contare il numero di vendite. Questa funzione accetta un argomento; in questo caso, è il numero ID del software. Abbiamo anche bisogno del GROUP BY
clausola in questa query per raggruppare i record in base al giorno dell'anno. (Nel nostro esempio, l'argomento effettivo è day_of_year
, l'alias per DATE_PART('doy',sale_date)
.)
Questo non è l'unico modo per ottenere il giorno dell'anno. Possiamo anche usare EXTRACT()
funzione.
Soluzione 2:
Ecco la query che scriveresti con EXTRACT()
funzione:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Questa funzione è simile a DATE_PART()
. La differenza è che utilizziamo FROM invece di una virgola tra l'identificatore della parte della data e l'argomento data e ora. Il risultato è lo stesso. Nota:EXTRACT()
è lo standard SQL.