Проблем:
Бихте искали да намерите разликата между две стойности за дата/дата и час в PostgreSQL база данни.
Пример:
Нашата база данни има таблица с име employment
с данни в колоните id
, first_name
, last_name
, start_date
и end_date
:
id | first_name | фамилно_име | начална_дата | крайна_дата |
---|---|---|---|---|
1 | Барбара | Уилсън | 2010-02-01 | 30.10.2018 |
2 | Робърт | Андерсън | 17.04.2001 | 20.12.2011 |
3 | Стивън | Нелсън | 01.06.2005 | 23.09.2019 |
За всеки служител нека получим името и фамилията им и разликата между началната и крайната дата на тяхната работа. Искаме да видим интервала в години, месеци и дни.
Решение 1:
Ще използваме AGE()
функция. Ето заявката, която бихте написали:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Ето резултата от заявката:
first_name | фамилно_име | interval_employment_interval |
---|---|---|
Барбара | Уилсън | 8 години 8 месеца 29 дни |
Робърт | Андерсън | 10 години 8 месеца 3 дни |
Стивън | Нелсън | 14 години 3 месеца 22 дни |
Дискусия:
Използвайте PostgreSQL AGE()
функция за извличане на интервала между две времеви марки или дати. Тази функция приема два аргумента:първият е крайна дата, а вторият е начална дата. В нашия пример използваме колоната end_date
(т.е. когато служителят е спрял да изпълнява тази работа) и колоната start_date
(когато служителят е започнал тази работа).
Разликата между датите се връща като интервал в години, месеци, дни, часове и т.н. Заявката за Стивън Нелсън върна периода на заетост като интервал „14 years 3 months 22 days
’; това е разликата между 2005-06-01, когато започна тази работа, и 2019-09-23, когато я спря.
AGE()
функцията може също да показва разликата между текущото времеви печат/дата и първия аргумент. В този случай функцията има само един аргумент:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Заявката по-горе показва интервала между текущото времеви печат (за този текст е „2019-09-26“) и крайната дата на всеки служител (колоната end_date
).
first_name | фамилно_име | interval_employment_interval |
---|---|---|
Барбара | Уилсън | 10 месеца 27 дни |
Робърт | Андерсън | 7 години 9 месеца 6 дни |
Стивън | Нелсън | 3 дни |
Изминаха три дни между последния ден на Стивън на работа и текущото времеви печат (към момента на писане това е 2019-09-26).
Решение 2:
Можете също да използвате оператора минус ( ‘-’ ) вместо AGE()
за да извадите две дати.
Ето заявката, която бихте написали:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
В този резултат ще видите разликата само в дни (не години, месеци и дни):
first_name | фамилно_име | interval_employment_interval |
---|---|---|
Барбара | Уилсън | 3193 |
Робърт | Андерсън | 3899 |
Стивън | Нелсън | 5227 |