Problem:
Du vill få årets dag från ett datum eller en tidsstämpelkolumn i PostgreSQL.
Exempel:
Vår databas har en tabell som heter software_sale
med data i kolumnerna id
, software
och sale_date
.
id | programvara | sale_date |
---|---|---|
1 | Super Game X | 2019-09-15 |
2 | Webbläsare X | 2019-10-15 |
3 | DB-nyheter | 2019-11-26 |
4 | MyPaintSoft | 2018-10-15 |
5 | Nytt OS | 2019-10-15 |
Låt oss räkna antalet sålda programvaror per dagar på året. Vi kommer att använda detta för att ta reda på vilka dagar på året (oberoende av det faktiska året) försäljningen var hög eller låg.
Lösning 1:
Vi använder DATE_PART()
fungera. Här är frågan du skulle skriva:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Här är resultatet av frågan:
day_of_year | räkna |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Diskussion:
Använd PostgreSQL DATE_PART()
funktion för att hämta numret på dagen på ett år från kolumnen datum/tid/datumtid/tidsstämpel. Denna funktion tar två argument. Det första argumentet är datumdelen (eller tidsdelen) som du vill att funktionen ska returnera. I det här exemplet använder vi "doy
’, som returnerar dagen på året. Du kan använda andra delar, som dag, år, månad, timme, minut, vecka, etc. Du kan lära dig mer i PostgreSQL-dokumentationen.
Det andra argumentet är datum/tid/datumtid/tidsstämpel som du vill extrahera datum/tidsdelen från. Detta kan vara ett uttryck som returnerar ett datum/tid/datumtid/tidsstämpelvärde eller namnet på en kolumn datum/tid/datumtid/tidsstämpel. (I vårt exempel är det en kolumn med datum datatyp.)
Funktionen DATE_PART()
med 'doy
’ identifierare returnerar numret på dagen på året (från 1 till 365/366) som ett heltal. I vårt exempel, dagen på året för försäljningsdatumet (från sale_date
kolumn) visas nu i en ny kolumn, day_of_year
. Den 15 oktober var den 288:e dagen 2019 och 2018; den dagen under två år gjordes totalt tre försäljningar (2 år 2019, 1 år 2018).
Vi använder COUNT()
aggregatfunktion för att räkna antalet försäljningar. Denna funktion tar ett argument; i det här fallet är det programvarans ID-nummer. Vi behöver också GROUP BY
klausul i denna fråga för att gruppera poster enligt dagen på året. (I vårt exempel är det faktiska argumentet day_of_year
, aliaset för DATE_PART('doy',sale_date)
.)
Detta är inte det enda sättet att få årets dag. Vi kan också använda EXTRACT()
funktion.
Lösning 2:
Här är frågan du skulle skriva med EXTRACT()
funktion:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Denna funktion liknar DATE_PART()
. Skillnaden är att vi använder FROM istället för ett kommatecken mellan datumdelidentifieraren och datum- och tidsargumentet. Resultatet är detsamma. Obs:EXTRACT()
är SQL-standard.