Проблем:
Искате да получите деня от годината от колона с дата или време в PostgreSQL.
Пример:
Нашата база данни има таблица с име software_sale
с данни в колоните id
, software
и sale_date
.
id | софтуер | дата_на_продажба |
---|---|---|
1 | Супер игра X | 15.09.2019 |
2 | Браузър X | 15.10.2019 |
3 | Новини от DB | 26.11.2019 |
4 | MyPaintSoft | 15.10.2018 |
5 | Нова ОС | 15.10.2019 |
Нека преброим броя на продадените софтуерни елементи по дни от годината. Ще използваме това, за да разберем в кои дни от годината (независимо от действителната година) продажбите са високи или ниски.
Решение 1:
Ще използваме DATE_PART()
функция. Ето заявката, която бихте написали:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Ето резултата от заявката:
day_of_year | брой |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Дискусия:
Използвайте PostgreSQL DATE_PART()
функция за извличане на номера на деня от годината от колона дата/час/дата и час. Тази функция приема два аргумента. Първият аргумент е частта за дата (или част от времето), която искате функцията да върне. В този пример използваме „doy
“, което връща деня от годината. Можете да използвате други части, като ден, година, месец, час, минута, седмица и т.н. Можете да научите повече в документацията на PostgreSQL.
Вторият аргумент е датата/часът/датата и часът, от който искате да извлечете частта за дата/час. Това може да бъде израз, връщащ стойност за дата/час/датта и времеви клеймо или името на колона дата/час/дата и час. (В нашия пример това е колона с дата тип данни.)
Функцията DATE_PART()
с „doy
’ идентификаторът връща номера на деня от годината (от 1 до 365/366) като цяло число. В нашия пример денят от годината на датата на продажба (от sale_date
колона) вече се показва в нова колона, day_of_year
. 15 октомври беше 288-ият ден през 2019 г. и през 2018 г.; на този ден за две години са извършени общо три продажби (2 през 2019 г., 1 през 2018 г.).
Използваме COUNT()
агрегатна функция за отчитане на броя на продажбите. Тази функция приема един аргумент; в този случай това е идентификационният номер на софтуера. Нуждаем се и от GROUP BY
клауза в тази заявка за групиране на записи според деня от годината. (В нашия пример действителният аргумент е day_of_year
, псевдонимът за DATE_PART('doy',sale_date)
.)
Това не е единственият начин да получите деня от годината. Можем също да използваме EXTRACT()
функция.
Решение 2:
Ето заявката, която бихте написали с EXTRACT()
функция:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Тази функция е подобна на DATE_PART()
. Разликата е, че използваме FROM вместо запетая между идентификатора на частта за дата и аргумента за дата и час. Резултатът е същият. Забележка:EXTRACT()
е SQL стандарт.