Problema:
Vorresti raggruppare i record per mese in un database PostgreSQL.
Esempio:
Il nostro database ha una tabella chiamata watch
con i dati nelle colonne id
, name
e production_timestamp
.
id | timestamp_produzione | |
---|---|---|
1 | guarda | 2019-03-01 11:45:23 |
2 | smartwatch | 15-09-2019 07:35:13 |
3 | smartband | 22-09-2019 17:22:05 |
Soluzione:
Puoi usare il DATE_TRUNC()
funzione per raggruppare i record in una tabella per mese.
Ecco la domanda che scriveresti:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Ecco il risultato della query:
produzione_al_mese | conta |
---|---|
01-03-2019 00:00:00 | 1 |
01-09-2019 00:00:00 | 2 |
Discussione:
Usa il DATE_TRUNC()
funzione se si desidera recuperare una data o un'ora con una precisione specifica da un database PostgreSQL. (Nel nostro esempio, abbiamo utilizzato la precisione del mese.)
Questa funzione accetta due argomenti. Innanzitutto, abbiamo l'identificatore della parte della data (nel nostro esempio, 'mese'). Si noti che lo specificatore è una stringa e deve essere racchiuso tra virgolette.
Il secondo argomento è il valore del timestamp; può essere un'espressione che restituisce un valore di timestamp o il nome di una colonna di timestamp. (Nel nostro esempio, utilizziamo la colonna production_timestamp
).
La funzione DATE_TRUNC()
tronca il timestamp alla precisione data (in questo caso, il mese). Nel nostro database, lo smartwatch ha la data di produzione 2019-09-15 07:35:13
; dopo essere stato troncato alla precisione del mese, diventa 2019-09-01 00:00:00
. La precisione a livello di mese fa sì che il giorno venga visualizzato come '01' e l'ora venga riempita con zeri. (Le parti della data troncata (ad es. giorni, mesi) del timestamp vengono sostituite con quelle.)
Raggruppare i record per mese è molto comune in PostgreSQL. Nel nostro esempio, il numero di prodotti viene sommato per ogni mese. (Il COUNT()
la funzione aggregata conta il numero di prodotti). Se si raggruppano i record utilizzando una funzione di aggregazione, è necessario utilizzare la clausola GROUP BY. Dopo la clausola GROUP BY, è necessario inserire le colonne o le espressioni utilizzate con la funzione di aggregazione nell'istruzione SELECT. (Nel nostro esempio, questo è DATE_TRUNC( 'month', production_timestamp)
.)
Naturalmente, non è necessario utilizzare il DATE_TRUNC()
funzione solo per raggruppare i record. Puoi anche usarlo per ottenere il primo giorno del mese per una determinata data.
Per ogni orologio, otteniamo il nome e la data di produzione con la precisione del mese, senza bisogno di raggruppamenti. Ecco la domanda che scriveresti:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Ecco il risultato:
nome | produzione_al_mese |
---|---|
guarda | 01-03-2019 00:00:00 |
smartwatch | 01-09-2019 00:00:00 |
smartband | 01-09-2019 00:00:00 |
In questa query, la funzione DATE_TRUNC()
tronca il timestamp alla precisione del mese. Nel nostro database, lo smartwatch ha la data di produzione '2019-09-15 07:35:13'
; ora è '2019-09-01 00:00:00'
, che è il primo giorno del mese.