Archiwa tagu: interval

PostgreSQL. Jak obliczyć różnicę wyrażoną w latach, miesiącach i dniach, pomiędzy dwoma datami? Funkcje AGE() i DATE_PART().

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.

PostgreSQL. Jak korzystać z interwałów czasowych?

Często w zapytaniach SQL które tworzymy zachodzi potrzeba skorzystania z jakiegoś interwału czasowego a nie wskazywania konkretnych dat. Np. za każdym razem kiedy uruchomię zapytanie w styczniu, marciu czy czerwcu, chcę żeby zapytanie za każdym razem kiedy się uruchoim brało pod uwagę rok wstecz.

I tutaj z pomocą przychodzą interwały. Np. chcemy żeby zapytanie wyświetliło nam wszystkie zdarzenia (np. tabela "events") gdzie data utworzenia tego zdarzenia ("createion_date") była rok wstecz.

Możemy to zrobić np. tak:

 

SELECT *

FROM events

WHERE events.creation_date BETWEEN NOW() – INTERVAL '1 year' AND NOW()

 

Jak wynika z powyższego słówkiem "INTERVAL" określamy interwał czasowy który nas interesuje. W przykładzie jest 1 rok ale oczywiście możemy użyć także "month", "day" itd.

Widzisz, że w bardzo prosty sposob można swoje zapytania tworzyć w bardziej uniwersalny sposób.