Проблем:
Бихте искали да намерите разликата между две стойности за дата/дата и час в 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 |