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.