Probleem:
U wilt de dag van het jaar halen uit een datum- of tijdstempelkolom in PostgreSQL.
Voorbeeld:
Onze database heeft een tabel met de naam software_sale
met gegevens in de kolommen id
, software
, en sale_date
.
id | software | sale_date |
---|---|---|
1 | Super Game X | 2019-09-15 |
2 | Browser X | 2019-10-15 |
3 | DB Nieuws | 26-11-2019 |
4 | MyPaintSoft | 2018-10-15 |
5 | Nieuw besturingssysteem | 2019-10-15 |
Laten we het aantal verkochte software-items per dag van het jaar tellen. We zullen dit gebruiken om erachter te komen op welke dagen van het jaar (onafhankelijk van het werkelijke jaar) de verkoop hoog of laag was.
Oplossing 1:
We gebruiken de DATE_PART()
functie. Dit is de vraag die je zou schrijven:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Dit is het resultaat van de zoekopdracht:
day_of_year | tel |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Discussie:
Gebruik de PostgreSQL DATE_PART()
functie om het nummer van de dag van een jaar op te halen uit een datum/tijd/datumtijd/tijdstempelkolom. Deze functie heeft twee argumenten. Het eerste argument is het datumgedeelte (of tijdgedeelte) dat u wilt dat de functie retourneert. In dit voorbeeld gebruiken we 'doy
', die de dag van het jaar retourneert. U kunt andere onderdelen gebruiken, zoals dag, jaar, maand, uur, minuut, week, enz. U kunt meer informatie vinden in de PostgreSQL-documentatie.
Het tweede argument is de datum/tijd/datum/tijdstempel waaruit u het datum/tijd-gedeelte wilt halen. Dit kan een expressie zijn die een datum/tijd/datumtijd/tijdstempelwaarde retourneert of de naam van een datum/tijd/datumtijd/tijdstempelkolom. (In ons voorbeeld is het een kolom van de datum gegevenstype.)
De functie DATE_PART()
met de 'doy
’ identifier retourneert het getal van de dag van het jaar (van 1 tot 365/366) als een geheel getal. In ons voorbeeld is de dag van het jaar van de verkoopdatum (van de sale_date
kolom) wordt nu weergegeven in een nieuwe kolom, day_of_year
. 15 oktober was de 288e dag in 2019 en in 2018; op die dag werden in twee jaar tijd in totaal drie verkopen gedaan (2 in 2019, 1 in 2018).
We gebruiken de COUNT()
aggregatiefunctie om het aantal verkopen te tellen. Deze functie heeft één argument nodig; in dit geval is dit het software-ID-nummer. We hebben ook de GROUP BY
. nodig clausule in deze query om records te groeperen volgens de dag van het jaar. (In ons voorbeeld is het eigenlijke argument day_of_year
, de alias voor DATE_PART('doy',sale_date)
.)
Dit is niet de enige manier om de dag van het jaar te krijgen. We kunnen ook de EXTRACT()
. gebruiken functie.
Oplossing 2:
Dit is de query die u zou schrijven met de EXTRACT()
functie:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Deze functie is vergelijkbaar met DATE_PART()
. Het verschil is dat we FROM gebruiken in plaats van een komma tussen de datumdeel-ID en het datum- en tijdargument. Het resultaat is hetzelfde. Opmerking:EXTRACT()
is SQL-standaard.