Problém:
Chcete seskupit záznamy podle měsíce v databázi PostgreSQL.
Příklad:
Naše databáze má tabulku s názvem watch
s údaji ve sloupcích id
, name
a production_timestamp
.
id | jméno | production_timestamp |
---|---|---|
1 | sledovat | 2019-03-01 11:45:23 |
2 | chytré hodinky | 2019-09-15 07:35:13 |
3 | chytrý pásek | 22.09.2019 17:22:05 |
Řešení:
Můžete použít DATE_TRUNC()
funkce k seskupení záznamů v tabulce podle měsíce.
Zde je dotaz, který byste napsali:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Zde je výsledek dotazu:
production_to_month | počet |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Diskuse:
Použijte DATE_TRUNC()
Pokud chcete získat datum nebo čas se specifickou přesností z databáze PostgreSQL. (V našem příkladu jsme použili měsíční přesnost.)
Tato funkce má dva argumenty. Nejprve máme specifikátor části data (v našem příkladu 'měsíc'). Všimněte si, že specifikátor je řetězec a musí být uzavřen v uvozovkách.
Druhý argument je hodnota časového razítka; může to být výraz vracející hodnotu časového razítka nebo název sloupce časového razítka. (V našem příkladu používáme sloupec production_timestamp
).
Funkce DATE_TRUNC()
zkrátí časové razítko na danou přesnost (v tomto případě na měsíc). V naší databázi chytré hodinky má datum výroby 2019-09-15 07:35:13
; po zkrácení na měsíční přesnost se změní na 2019-09-01 00:00:00
. Přesnost na úrovni měsíce způsobí, že se den zobrazí jako „01“ a čas se vyplní nulami. (Zkrácené části data (např. dny, měsíce) časového razítka jsou nahrazeny jedničkami.)
Seskupování záznamů podle měsíců je v PostgreSQL velmi běžné. V našem příkladu je celkový počet produktů za každý měsíc. (COUNT()
agregační funkce počítá počet produktů). Pokud seskupujete záznamy pomocí agregační funkce, musíte použít klauzuli GROUP BY. Za klauzuli GROUP BY byste měli umístit sloupce nebo výrazy používané s agregační funkcí do příkazu SELECT. (V našem příkladu je to DATE_TRUNC( 'month', production_timestamp)
.)
Samozřejmě nemusíte používat DATE_TRUNC()
fungovat pouze pro seskupování záznamů. Můžete jej také použít k získání prvního dne v měsíci pro dané datum.
U každých hodinek získejte přesnost názvu a data výroby na měsíc – není potřeba seskupování. Zde je dotaz, který byste napsali:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Zde je výsledek:
name | production_to_month |
---|---|
sledovat | 2019-03-01 00:00:00 |
chytré hodinky | 2019-09-01 00:00:00 |
chytrý pásek | 2019-09-01 00:00:00 |
V tomto dotazu funkce DATE_TRUNC()
zkrátí časové razítko na měsíční přesnost. V naší databázi chytré hodinky má datum výroby '2019-09-15 07:35:13'
; nyní je '2019-09-01 00:00:00'
, což je první den v měsíci.