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.