Problem:
Chcesz pogrupować rekordy według miesiąca w bazie danych PostgreSQL.
Przykład:
Nasza baza danych zawiera tabelę o nazwie watch
z danymi w kolumnach id
, name
i production_timestamp
.
id | imię | product_timestamp |
---|---|---|
1 | oglądaj | 2019-03-01 11:45:23 |
2 | smartwatch | 2019-09-15 07:35:13 |
3 | inteligentna opaska | 2019-09-22 17:22:05 |
Rozwiązanie:
Możesz użyć DATE_TRUNC()
funkcja grupowania rekordów w tabeli według miesiąca.
Oto zapytanie, które możesz napisać:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Oto wynik zapytania:
produkcja_do_miesiąca | liczba |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Dyskusja:
Użyj DATE_TRUNC()
funkcja, jeśli chcesz pobrać datę lub godzinę z określoną precyzją z bazy danych PostgreSQL. (W naszym przykładzie użyliśmy dokładności miesięcznej).
Ta funkcja przyjmuje dwa argumenty. Najpierw mamy specyfikator części daty (w naszym przykładzie „miesiąc”). Zauważ, że specyfikator jest łańcuchem i musi być ujęty w cudzysłów.
Drugi argument to wartość znacznika czasu; może to być wyrażenie zwracające wartość znacznika czasu lub nazwę kolumny znacznika czasu. (W naszym przykładzie używamy kolumny production_timestamp
).
Funkcja DATE_TRUNC()
obcina znacznik czasu do określonej precyzji (w tym przypadku miesiąca). W naszej bazie danych smartwatch ma datę produkcji 2019-09-15 07:35:13
; po skróceniu do dokładności miesięcznej staje się 2019-09-01 00:00:00
. Dokładność na poziomie miesiąca powoduje, że dzień jest wyświetlany jako „01”, a czas jest wypełniony zerami. (Obcięte części daty (np. dni, miesiące) znacznika czasu są zastępowane jedynkami.)
Grupowanie rekordów według miesiąca jest bardzo powszechne w PostgreSQL. W naszym przykładzie liczba produktów jest sumowana w każdym miesiącu. (COUNT()
funkcja agregująca zlicza liczbę produktów). Jeśli grupujesz rekordy za pomocą funkcji agregującej, musisz użyć klauzuli GROUP BY. Po klauzuli GROUP BY należy umieścić kolumny lub wyrażenia używane z funkcją agregującą w instrukcji SELECT. (W naszym przykładzie jest to DATE_TRUNC( 'month', production_timestamp)
.)
Oczywiście nie musisz używać DATE_TRUNC()
funkcja tylko do grupowania rekordów. Możesz go również użyć, aby uzyskać pierwszy dzień miesiąca dla danego dnia.
Dla każdego zegarka podajmy nazwę i datę produkcji z dokładnością do miesiąca – bez konieczności grupowania. Oto zapytanie, które możesz napisać:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Oto wynik:
nazwa | produkcja_do_miesiąca |
---|---|
oglądaj | 2019-03-01 00:00:00 |
smartwatch | 2019-09-01 00:00:00 |
inteligentna opaska | 2019-09-01 00:00:00 |
W tym zapytaniu funkcja DATE_TRUNC()
obcina sygnaturę czasową do dokładności miesiąca. W naszej bazie danych smartwatch ma datę produkcji '2019-09-15 07:35:13'
; teraz to '2019-09-01 00:00:00'
, czyli pierwszy dzień miesiąca.