PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak znaleźć odstęp między dwiema datami w PostgreSQL

Problem:

Chcesz znaleźć różnicę między dwiema wartościami daty/daty/godziny w bazie danych PostgreSQL.

Przykład:

Nasza baza danych zawiera tabelę o nazwie employment z danymi w kolumnach id , first_name , last_name , start_date i end_date :

id imię nazwisko data_początkowa data_końcowa
1 Barbara Wilson 2010-02-01 2018-10-30
2 Robert Anderson 2001-04-17 2011-12-20
3 Steven Nelson 2005-06-01 23-09-2019

Dla każdego pracownika zdobądźmy jego imię i nazwisko oraz różnicę między datą rozpoczęcia i zakończenia zatrudnienia. Chcemy zobaczyć odstęp w latach, miesiącach i dniach.

Rozwiązanie 1:

Użyjemy AGE() funkcjonować. Oto zapytanie, które możesz napisać:

SELECT first_name, 
             last_name, 
             AGE(end_date, start_date) 
         AS  employment_interval 
FROM employment;

Oto wynik zapytania:

imię nazwisko employment_interval
Barbara Wilson 8 lat 8 miesięcy 29 dni
Robert Anderson 10 lat 8 miesięcy 3 dni
Steven Nelson 14 lat 3 miesiące 22 dni

Dyskusja:

Użyj PostgreSQLa AGE() funkcja pobierania interwału między dwoma znacznikami czasu lub datami. Ta funkcja przyjmuje dwa argumenty:pierwszy to data zakończenia, a drugi to data rozpoczęcia. W naszym przykładzie używamy kolumny end_date (tj. kiedy pracownik przestał wykonywać tę pracę) oraz kolumnę start_date (kiedy pracownik rozpoczął tę pracę).

Różnica między datami jest zwracana jako przedział w latach, miesiącach, dniach, godzinach itd. Zapytanie o Steven Nelson zwrócił okres zatrudnienia jako przedział „14 years 3 months 22 days ”; to jest różnica między 2005-06-01, kiedy zaczął tę pracę, a 2019-09-23, kiedy ją przerwał.

AGE() funkcja może również wyświetlać różnicę między bieżącym znacznikiem czasu/datą a pierwszym argumentem. W tym przypadku funkcja ma tylko jeden argument:

SELECT first_name,
             last_name,
             AGE(end_date)
         AS  employment_interval
FROM employment;

Powyższe zapytanie wyświetla interwał między bieżącym znacznikiem czasu (dla tego tekstu jest to „2019-09-26”) a datą zakończenia każdego pracownika (kolumna end_date ).

imię nazwisko employment_interval
Barbara Wilson 10 miesięcy 27 dni
Robert Anderson 7 lat 9 miesięcy 6 dni
Steven Nelson 3 dni

Minęły trzy dni od ostatniego dnia Stevena w pracy do aktualnego znacznika czasu (w momencie pisania tego tekstu jest to 26.09.2019).

Rozwiązanie 2:

Możesz także użyć operatora minus ( ‘-’ ) zamiast AGE() aby odjąć dwie daty.

Oto zapytanie, które napiszesz:

SELECT first_name,
             last_name,
             end_date::DATE – start_date::DATE 
         AS  employment_interval 
FROM employment;

W tym wyniku zobaczysz tylko różnicę w dniach (nie w latach, miesiącach i dniach):

imię nazwisko employment_interval
Barbara Wilson 3193
Robert Anderson 3899
Steven Nelson 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. Szczegółowe informacje na temat dostawców usług w chmurze:PostgreSQL na platformie Google Cloud (GCP)

  2. NOT IN w postgresql nie działa

  3. Zapytanie PostgreSQL ILIKE z SQLAlchemy

  4. Wyłącz ostrzeżenie w sqlalchemy

  5. Jak uzyskać koniec dnia?