Problem:
Du ønsker at få årets dag fra en dato eller en tidsstempelkolonne i PostgreSQL.
Eksempel:
Vores database har en tabel med navnet software_sale
med data i kolonnerne id
, software
og sale_date
.
id | software | udsalgsdato |
---|---|---|
1 | Super Game X | 2019-09-15 |
2 | Browser X | 2019-10-15 |
3 | DB Nyheder | 2019-11-26 |
4 | MyPaintSoft | 2018-10-15 |
5 | Nyt OS | 2019-10-15 |
Lad os tælle antallet af solgte softwareartikler efter dage i året. Vi bruger dette til at finde ud af, hvilke dage på året (uafhængig af det faktiske år) salget var højt eller lavt.
Løsning 1:
Vi bruger DATE_PART()
fungere. Her er den forespørgsel, du ville skrive:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Her er resultatet af forespørgslen:
day_of_year | tæller |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Diskussion:
Brug PostgreSQL DATE_PART()
funktion til at hente nummeret på dagen i et år fra en dato/tid/datotid/tidsstempelkolonne. Denne funktion tager to argumenter. Det første argument er den datodel (eller tidsdel), du ønsker, at funktionen skal returnere. I dette eksempel bruger vi 'doy
’, som returnerer årets dag. Du kan bruge andre dele, såsom dag, år, måned, time, minut, uge osv. Du kan lære mere i PostgreSQL-dokumentationen.
Det andet argument er datoen/klokkeslættet/dato/tidsstemplet du vil udtrække dato/tidsdelen fra. Dette kan være et udtryk, der returnerer en dato/tid/datotid/tidsstempelværdi eller navnet på en dato/klokkeslæt/datotid/tidsstempel. (I vores eksempel er det en kolonne med datoen datatype.)
Funktionen DATE_PART()
med 'doy
’ identifikator returnerer nummeret på dagen i året (fra 1 til 365/366) som et heltal. I vores eksempel, dagen på året for salgsdatoen (fra sale_date
kolonne) vises nu i en ny kolonne, day_of_year
. Den 15. oktober var den 288. dag i 2019 og i 2018; den dag over to år blev der i alt gennemført tre salg (2 i 2019, 1 i 2018).
Vi bruger COUNT()
aggregeringsfunktion til at tælle antallet af salg. Denne funktion tager et argument; i dette tilfælde er det software-id-nummeret. Vi har også brug for GROUP BY
klausul i denne forespørgsel til at gruppere poster i henhold til dagen på året. (I vores eksempel er det faktiske argument day_of_year
, alias for DATE_PART('doy',sale_date)
.)
Dette er ikke den eneste måde at få årets dag på. Vi kan også bruge EXTRACT()
funktion.
Løsning 2:
Her er den forespørgsel, du ville skrive 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;
Denne funktion ligner DATE_PART()
. Forskellen er, at vi bruger FROM i stedet for et komma mellem datodel-id'et og dato- og tidsargumentet. Resultatet er det samme. Bemærk:EXTRACT()
er SQL-standard.