Problem:
Sie möchten Datensätze in einer PostgreSQL-Datenbank nach Monat gruppieren.
Beispiel:
Unsere Datenbank hat eine Tabelle namens watch
mit Daten in den Spalten id
, name
und production_timestamp
.
id | Name | Produktionszeitstempel |
---|---|---|
1 | ansehen | 2019-03-01 11:45:23 |
2 | Smartwatch | 2019-09-15 07:35:13 |
3 | Smartband | 2019-09-22 17:22:05 |
Lösung:
Sie können den DATE_TRUNC()
verwenden Funktion zum Gruppieren von Datensätzen in einer Tabelle nach Monat.
Hier ist die Abfrage, die Sie schreiben würden:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Hier ist das Ergebnis der Abfrage:
production_to_month | zählen |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Diskussion:
Verwenden Sie das DATE_TRUNC()
-Funktion, wenn Sie ein Datum oder eine Uhrzeit mit einer bestimmten Genauigkeit aus einer PostgreSQL-Datenbank abrufen möchten. (In unserem Beispiel haben wir die Monatsgenauigkeit verwendet.)
Diese Funktion benötigt zwei Argumente. Zuerst haben wir den Datumsteilbezeichner (in unserem Beispiel „Monat“). Beachten Sie, dass der Bezeichner eine Zeichenfolge ist und in Anführungszeichen gesetzt werden muss.
Das zweite Argument ist der Zeitstempelwert; Dies kann ein Ausdruck sein, der einen Zeitstempelwert oder den Namen einer Zeitstempelspalte zurückgibt. (In unserem Beispiel verwenden wir die Spalte production_timestamp
).
Die Funktion DATE_TRUNC()
kürzt den Zeitstempel auf die angegebene Genauigkeit (in diesem Fall den Monat). In unserer Datenbank die Smartwatch hat das Produktionsdatum 2019-09-15 07:35:13
; nachdem es auf Monatsgenauigkeit gekürzt wurde, wird es zu 2019-09-01 00:00:00
. Die Genauigkeit auf Monatsebene bewirkt, dass der Tag als „01“ angezeigt und die Uhrzeit mit Nullen aufgefüllt wird. (Die abgeschnittenen Datumsteile (z. B. Tage, Monate) des Zeitstempels werden durch Einsen ersetzt.)
Das Gruppieren von Datensätzen nach Monat ist in PostgreSQL weit verbreitet. In unserem Beispiel wird die Anzahl der Produkte für jeden Monat summiert. (Der COUNT()
Aggregatfunktion zählt die Anzahl der Produkte). Wenn Sie Datensätze mit einer Aggregatfunktion gruppieren, müssen Sie die GROUP BY-Klausel verwenden. Nach der GROUP BY-Klausel sollten Sie die mit der Aggregatfunktion verwendeten Spalten oder Ausdrücke in der SELECT-Anweisung platzieren. (In unserem Beispiel ist dies DATE_TRUNC( 'month', production_timestamp)
.)
Natürlich müssen Sie das DATE_TRUNC()
nicht verwenden Funktion nur zum Gruppieren von Datensätzen. Sie können es auch verwenden, um den ersten Tag des Monats für ein bestimmtes Datum zu erhalten.
Lassen Sie uns für jede Uhr den Namen und das Herstellungsdatum auf den Monat genau ermitteln – keine Gruppierung erforderlich. Hier ist die Abfrage, die Sie schreiben würden:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Hier ist das Ergebnis:
name | production_to_month |
---|---|
beobachten | 2019-03-01 00:00:00 |
Smartwatch | 2019-09-01 00:00:00 |
Smartband | 2019-09-01 00:00:00 |
In dieser Abfrage wird die Funktion DATE_TRUNC()
kürzt den Zeitstempel auf Monatsgenauigkeit. In unserer Datenbank die Smartwatch hat das Produktionsdatum '2019-09-15 07:35:13'
; jetzt ist es '2019-09-01 00:00:00'
, das ist der erste Tag des Monats.