Problem:
Du vill gruppera poster efter månad i en PostgreSQL-databas.
Exempel:
Vår databas har en tabell som heter watch
med data i kolumnerna id
, name
, och production_timestamp
.
id | namn | produktionstidsstämpel |
---|---|---|
1 | titta | 2019-03-01 11:45:23 |
2 | smartwatch | 2019-09-15 07:35:13 |
3 | smartband | 2019-09-22 17:22:05 |
Lösning:
Du kan använda DATE_TRUNC()
funktion för att gruppera poster i en tabell efter månad.
Här är frågan du skulle skriva:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Här är resultatet av frågan:
produktion_till_månad | räkna |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Diskussion:
Använd DATE_TRUNC()
funktion om du vill hämta ett datum eller en tid med en specifik precision från en PostgreSQL-databas. (I vårt exempel använde vi månadsprecision.)
Denna funktion tar två argument. Först har vi datumdelspecifikatorn (i vårt exempel "månad"). Observera att specifikationen är en sträng och måste omges av citattecken.
Det andra argumentet är tidsstämpelvärdet; detta kan vara ett uttryck som returnerar ett tidsstämpelvärde eller namnet på en tidsstämpelkolumn. (I vårt exempel använder vi kolumnen production_timestamp
).
Funktionen DATE_TRUNC()
trunkerar tidsstämpeln till den givna precisionen (i detta fall månaden). I vår databas, smartwatch har produktionsdatumet 2019-09-15 07:35:13
; efter att den har trunkerats till månadsprecision blir den 2019-09-01 00:00:00
. Precisionen på månadsnivå gör att dagen visas som '01' och tiden fylls med nollor. (De trunkerade datumdelarna (t.ex. dagar, månader) av tidsstämpeln ersätts med ettor.)
Gruppering av poster efter månad är mycket vanligt i PostgreSQL. I vårt exempel summeras antalet produkter för varje månad. (COUNT()
aggregatfunktion räknar antalet produkter). Om du grupperar poster med en aggregatfunktion måste du använda GROUP BY-satsen. Efter GROUP BY-satsen ska du placera kolumnerna eller uttrycken som används med aggregatfunktionen i SELECT-satsen. (I vårt exempel är detta DATE_TRUNC( 'month', production_timestamp)
.)
Naturligtvis behöver du inte använda DATE_TRUNC()
fungerar bara för att gruppera poster. Du kan också använda den för att få den första dagen i månaden för ett visst datum.
För varje klocka, låt oss få namnet och produktionsdatum till månad precision – ingen gruppering behövs. Här är frågan du skulle skriva:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Här är resultatet:
namn | produktion_till_månad |
---|---|
titta | 2019-03-01 00:00:00 |
smartwatch | 2019-09-01 00:00:00 |
smartband | 2019-09-01 00:00:00 |
I den här frågan, funktionen DATE_TRUNC()
trunkerar tidsstämpeln till månadsprecision. I vår databas, smartwatch har produktionsdatumet '2019-09-15 07:35:13'
; nu är det '2019-09-01 00:00:00'
, vilket är den första dagen i månaden.