Witam Was serdecznie w kolejnym wpisie dotyczący PostgerSQL-a. Dzisiaj zajmiemy się obliczaniem różnicy pomiędzy dwoma datami, wyrażoną w latach, miesiącach lub dniach. Tak naprawdę, żeby zrealizować nasz cel skorzystamy tylko z dwóch funkcji: AGE() i DATE_PART().
Pierwsza z nich, funkcja AGE(), zwróci nam różnicę pomiędzy dwoma datami. Funkcja ta zwróci nam wynik w postaci interwału czasowego np. 9 years 1 mons 2 days.
Możemy z niej skorzystać na dwa sposoby.
W pierwszym przypadku podajemy dwa argumenty, które są datami. Wtedy funkcja AGE() zwróci nam różnicę pomiędzy nimi. Dodatkowa zasada jest taka, żeby pierwsza data była tą "starszą" a druga "młodszą" (bliższą dacie dzisiejszej), bo inaczej otrzymamy wynik ujemny.
Składnia:
age(timestamp, timestamp)
Przykład:
SELECT AGE( TIMESTAMP '2010-01-01' , TIMESTAMP '2000-12-31' )
Wynik:
9 years 1 day
W drugim przypadku podajemy jeden argument, który także jest datą. Wtedy funkcja AGE() zwróci nam różnicę między podaną datą a datą dzisiejszą.
Składnia:
age(timestamp)
Przykład:
SELECT AGE( TIMESTAMP '2010-01-01' )
Wynik:
11 years 6 mons 17 days <- bo zapytanie wykonałem 18 lipca 2021
OK. Korzystać z funkcji AGE() już potrafimy.
Teraz weźmy się za funkcję DATE_PART(). Funkcja ta "wyciągnie" nam interesującą część daty z daty w postaci "timestamp", np. rok, miesiąc, dzień lub z Interwału.
Z tej funkcji także możemy skorzystać na dwa sposoby.
W pierwszym sposobie podajemy dwa argumenty: text i timestamp a w drugiem: text i interval.
No to przykład dotyczący pierwszego sposobu, czyli podajemy dwa parametry: text i datę w formacie timestamp.
Składnia:
date_part(text, timestamp)
Przykład:
SELECT DATE_PART( 'year' , TIMESTAMP'2000-01-01' )
Wynik:
2000
oczywiście w miejsce 'year' możemy podać np. 'month' lub 'day' i wtedy otrzymamy interesującą nas część daty.
Drugi sposób to podanie dwóch argumentów: części daty która nas interesuje i interwału czasowego.
Składnia:
date_part(text, interval)
Przykład:
SELECT DATE_PART( 'year' , interval '10 years 4 month 19 days' )
Wynik:
10
Skoro jako drugi argument funkcji DATE_PART() możemy podać interwał czasowy to możemy skorzystać z funkcji AGE() która zwraca nam właśnie taki typ.
Składnia:
date_part(text, AGE())
Przykład:
SELECT DATE_PART( 'year' , AGE( '2020-06-10' , '2008-01-24' ) )
Wynik:
12
Mamy już pełną wiedzę na temat wykorzystania funkcji AGE() i DATE_PART(). Ale chciałem Ci jeszcze zwrócić uwagę na pewiem mały szkopół.
Może posłużmy się przykładem. Wykonaj coś takiego.
Przykład:
SELECT
DATE_PART( 'year' , AGE( '2020-06-10' , '2008-01-24' ) ),
DATE_PART( 'year' , AGE( '2020-06-10' , '2008-12-24' ) )
Wynik:
12 , 11
Patrząc na wyniki pojawia się pytanie. Dlaczego mamy inne wyniki w latach (bo pierwszy argument DATE_PART to 'year') skoro w obu wierszach mamy te same daty jeśli chodzi o rok? No to zernijmy na miesiące w obu wierszach. Pierwsza data jest identyczna w obu wierszach i jest nią 10 czerwiec 2020 roku. Natomiast druga data w pierwszym wierszy to 24 styczeń 2008 a w drugim wierszu 24 grudzień 2008. Czyli w pierwszym wierszu styczeń jest przed czerwcem a w drugim wierszu grudzień jest za czerwcem i dlatego funkcja AGE() zwraca inny interwał czasowy. Dla pierwszego wiersza będzie to: "12 years 4 mons 17 days" i dlatego wynikiem działania funkcji DATE_PART jest liczba 12, a w drugiem wierszu funkcja AGE() zwraca: "11 years 5 mons 17 days" dlatego DATE_PART zwróci nam: 11.
Także na poczatku musimy się zastanowić co tak naprawdę nas interesuje. Czy chcemy np. obliczyć różnicę w latach, ale pełnych latach? Czy jeśli rok "nie będzie pełny" to chcemy uzyskać liczbę o jedną mniej niż wynikałoby to lat zapisanych w datach.
Także zwródźcie na to uwagę i miłego programowania.
Dzięki za przeczytanie niniejszego wpisu. Serdecznie zapraszam na kolejne z tej serii.