Проблем:
Искате да групирате записи по месеци в PostgreSQL база данни.
Пример:
Нашата база данни има таблица с име watch
с данни в колоните id
, name
и production_timestamp
.
id | име | product_timestamp |
---|---|---|
1 | гледайте | 2019-03-01 11:45:23 |
2 | умен часовник | 2019-09-15 07:35:13 |
3 | интелигентна лента | 22.09.2019 17:22:05 |
Решение:
Можете да използвате DATE_TRUNC()
функция за групиране на записи в таблица по месеци.
Ето заявката, която бихте написали:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Ето резултата от заявката:
production_to_month | брой |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Дискусия:
Използвайте DATE_TRUNC()
функция, ако искате да извлечете дата или час с определена точност от PostgreSQL база данни. (В нашия пример използвахме месечна точност.)
Тази функция приема два аргумента. Първо, имаме спецификатора на частта за дата (в нашия пример „месец“). Имайте предвид, че спецификаторът е низ и трябва да бъде затворен в кавички.
Вторият аргумент е стойността на времевата марка; това може да бъде израз, връщащ стойност на времеви печат или името на колона с времеви печат. (В нашия пример използваме колоната production_timestamp
).
Функцията DATE_TRUNC()
съкраща клеймото за време до дадената точност (в този случай месец). В нашата база данни умният часовник има дата на производство 2019-09-15 07:35:13
; след като е съкратен до месечна точност, става 2019-09-01 00:00:00
. Прецизността на ниво месец кара деня да се показва като '01' и времето да се попълни с нули. (Скъсените части за дата (напр. дни, месеци) на клеймото за време се заменят с единици.)
Групирането на записи по месеци е много често в PostgreSQL. В нашия пример броят на продуктите се сумира за всеки месец. (COUNT()
агрегатната функция отчита броя на продуктите). Ако групирате записи с помощта на агрегатна функция, трябва да използвате клаузата GROUP BY. След клаузата GROUP BY трябва да поставите колоните или изразите, използвани с агрегатната функция в оператора SELECT. (В нашия пример това е DATE_TRUNC( 'month', production_timestamp)
.)
Разбира се, не е нужно да използвате DATE_TRUNC()
функция само за групиране на записи. Можете също да го използвате, за да получите първия ден от месеца за дадена дата.
За всеки часовник, нека получим името и датата на производство до месец точност – не е необходимо групиране. Ето заявката, която бихте написали:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Ето резултата:
name | production_to_month |
---|---|
гледайте | 2019-03-01 00:00:00 |
умен часовник | 2019-09-01 00:00:00 |
интелигентна лента | 2019-09-01 00:00:00 |
В тази заявка функцията DATE_TRUNC()
съкращава клеймото за време до месечна точност. В нашата база данни умният часовник има дата на производство '2019-09-15 07:35:13'
; сега е '2019-09-01 00:00:00'
, което е първият ден от месеца.