Probleem:
U wilt records per maand groeperen in een PostgreSQL-database.
Voorbeeld:
Onze database heeft een tabel met de naam watch
met gegevens in de kolommen id
, name
, en production_timestamp
.
id | naam | production_timestamp |
---|---|---|
1 | kijken | 2019-03-01 11:45:23 |
2 | smartwatch | 2019-09-15 07:35:13 |
3 | smartband | 2019-09-22 17:22:05 |
Oplossing:
U kunt de DATE_TRUNC()
. gebruiken functie om records per maand in een tabel te groeperen.
Dit is de vraag die je zou schrijven:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Dit is het resultaat van de zoekopdracht:
production_to_month | tel |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Discussie:
Gebruik de DATE_TRUNC()
functie als u een datum of tijd met een bepaalde precisie uit een PostgreSQL-database wilt ophalen. (In ons voorbeeld gebruikten we de precisie van de maand.)
Deze functie heeft twee argumenten. Ten eerste hebben we de specificatie van het datumgedeelte (in ons voorbeeld 'maand'). Merk op dat de specificatie een tekenreeks is en tussen aanhalingstekens moet worden geplaatst.
Het tweede argument is de tijdstempelwaarde; dit kan een expressie zijn die een tijdstempelwaarde retourneert of de naam van een tijdstempelkolom. (In ons voorbeeld gebruiken we de kolom production_timestamp
).
De functie DATE_TRUNC()
kapt de tijdstempel af tot de opgegeven precisie (in dit geval de maand). In onze database is de smartwatch heeft de productiedatum 2019-09-15 07:35:13
; nadat het is afgekapt tot maandprecisie, wordt het 2019-09-01 00:00:00
. De precisie op maandniveau zorgt ervoor dat de dag wordt weergegeven als '01' en de tijd wordt gevuld met nullen. (De afgekapte datumdelen (bijv. dagen, maanden) van de tijdstempel worden vervangen door enen.)
Het groeperen van records per maand is heel gebruikelijk in PostgreSQL. In ons voorbeeld wordt het aantal producten per maand opgeteld. (De COUNT()
aggregatiefunctie telt het aantal producten). Als u records groepeert met behulp van een aggregatiefunctie, moet u de GROUP BY-component gebruiken. Na de GROUP BY-component moet u de kolommen of expressies die worden gebruikt met de aggregatiefunctie in de SELECT-instructie plaatsen. (In ons voorbeeld is dit DATE_TRUNC( 'month', production_timestamp)
.)
Natuurlijk hoeft u de DATE_TRUNC()
. niet te gebruiken functie alleen om records te groeperen. Je kunt het ook gebruiken om de eerste dag van de maand voor een bepaalde datum te krijgen.
Laten we voor elk horloge de naam en productiedatum tot maand nauwkeurig weergeven - geen groepering nodig. Dit is de vraag die je zou schrijven:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Dit is het resultaat:
naam | productie_naar_maand |
---|---|
kijk | 2019-03-01 00:00:00 |
smartwatch | 2019-09-01 00:00:00 |
smartband | 2019-09-01 00:00:00 |
In deze query is de functie DATE_TRUNC()
kapt de tijdstempel af tot maandprecisie. In onze database is de smartwatch heeft de productiedatum '2019-09-15 07:35:13'
; nu is het '2019-09-01 00:00:00'
, dat is de eerste dag van de maand.