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 |