PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да намерите интервала между две дати в PostgreSQL

Проблем:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql заявка между периоди от време

  2. съхранявайте резултата от postgresql в bash променлива

  3. Как можете да свържете активните потребители към PostgreSQL база данни чрез SQL?

  4. Как да направя заявка за всички редове в радиус от 5 мили от моите координати?

  5. Как да разбера дали резервното ми копие на PostgreSQL е добро?