Problém:
Chcete získat den v roce ze sloupce data nebo časového razítka v PostgreSQL.
Příklad:
Naše databáze obsahuje tabulku s názvem software_sale
s údaji ve sloupcích id
, software
a sale_date
.
id | software | sale_date |
---|---|---|
1 | Super hra X | 2019-09-15 |
2 | Prohlížeč X | 2019-10-15 |
3 | Zprávy DB | 26. 11. 2019 |
4 | MyPaintSoft | 2018-10-15 |
5 | Nový operační systém | 2019-10-15 |
Spočítejme si počet prodaných softwarových položek podle dnů v roce. Použijeme to ke zjištění, které dny v roce (nezávisle na skutečném roce) byly prodeje vysoké nebo nízké.
Řešení 1:
Použijeme DATE_PART()
funkce. Zde je dotaz, který byste napsali:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Zde je výsledek dotazu:
day_of_year | počet |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Diskuse:
Použijte PostgreSQL DATE_PART()
funkce pro načtení čísla dne v roce ze sloupce datum/čas/datum a čas/časové razítko. Tato funkce má dva argumenty. První argument je část data (nebo časová část), kterou má funkce vrátit. V tomto příkladu používáme „doy
“, který vrací den v roce. Můžete použít další části, jako je den, rok, měsíc, hodina, minuta, týden atd. Více se můžete dozvědět v dokumentaci PostgreSQL.
Druhý argument je datum/čas/datumčas/časové razítko, ze kterého chcete část data/času extrahovat. Může to být výraz vracející hodnotu datum/čas/datum/čas/časové razítko nebo název sloupce datum/čas/datum a čas/časové razítko. (V našem příkladu se jedná o sloupec datum datový typ.)
Funkce DATE_PART()
pomocí „doy
’ identifikátor vrací číslo dne v roce (od 1 do 365/366) jako celé číslo. V našem příkladu den v roce data prodeje (z sale_date
sloupec) se nyní zobrazuje v novém sloupci day_of_year
. 15. říjen byl 288. dnem v roce 2019 a v roce 2018; toho dne za dva roky byly uskutečněny celkem tři prodeje (2 v roce 2019, 1 v roce 2018).
Používáme COUNT()
agregační funkce pro počítání počtu prodejů. Tato funkce má jeden argument; v tomto případě je to identifikační číslo softwaru. Potřebujeme také GROUP BY
klauzule v tomto dotazu seskupit záznamy podle dne v roce. (V našem příkladu je skutečný argument day_of_year
, alias pro DATE_PART('doy',sale_date)
.)
Toto není jediný způsob, jak získat den v roce. Můžeme také použít EXTRACT()
funkce.
Řešení 2:
Zde je dotaz, který byste napsali pomocí EXTRACT()
funkce:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Tato funkce je podobná funkci DATE_PART()
. Rozdíl je v tom, že místo čárky mezi identifikátorem části data a argumentem data a času používáme FROM. Výsledek je stejný. Poznámka:EXTRACT()
je standard SQL.