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 |