sobota, 6 listopada 2010

Kurs Oracle SQL. Daty i funcje do manipulowania datami

Daty i funkcje do manipulowania datami



Oracle posiada zmienną systemową SYSDATE przechowującą aktualną datę. Aby ją odczytać możemy skorzystać z tabeli DUAL. Posiada jeden wiersz i jedną kolumnę
i służy m.in. do odczytywania zmiennych systemowych. Nie przechowuje danych na stałe.




Daty można również od siebie odjąć. Wynikiem będzie liczba dni pomiędzy datami.







Do daty możemy również dodać wartość i jako wynik uzyskamy datę za podaną ilość dni.




MONTHS_BETWEEN


Funkcja month_between zwraca ilość miesięcy pomiędzy datami.






ADD_MONTHS


Dodaje do podanej daty n miesięcy.


LAST_DAY


zwraca datę ostatniego dnia miesiąca zawierającego podaną datę.



ROUND


funkcja zaokrągla datę do północy, jeśli jest przed południem lub do północy dnia następnego, jeśli jest po południu. W przypadku podania dodatkowego parametru zaokrągla datę do pełnego miesiąca lub roku. Na poniższych przykładach widać dwa rodzaje zaokrągleń.




TRUNC


funkcja podobna do round, jednak zamiast zaokrąglać ucina daty.
Na poniższych przykładach pokazałem ucięcie do roku oraz miesiąca.


to_date


to_date (text [,text1]) - zamienia ciąg znaków text na datę według wzorca zawartego w text1. Wzorzec pozwala poprawnie zinterpretować znaki zawarte w ciągu text.








Formaty dla funkcji to_date



Parametr Opis
YEAR Rok, słownie
YYYY Czterocyfrowy rok
YYY
YY
Y
Ostatnie 3,2 lub 1 cyfra roku.
IYY
IY
I
Ostatnie 3,2 lub 1 z roku w notacji ISO np. 1995-02-04
IYYY Czterocyfrowy rok w notacji ISO
RRRR Przyjmuje dwucyfrowy rok, a zwraca w czterocyfrowej notacji.
Wartości z zakresu 0-49 zwróci jako lata 20 wieku.
Wartości z zakresu 50-99 zwróci jako lata 19 wieku.
Q Kwartał roku (1, 2, 3, 4; JAN-MAR = 1).
MM Miesiąc (01-12; JAN = 01).
MON Trzyliterowa nazwa miesiąca (JAN)
MONTH Nazwa miesiąca
RM Rok w notacji rzymskiej (I-XII; JAN = I).
WW Tydzień w roku.
W Tydzień w miesiącu.
D Dzień w tygodniu (1-7).
DAY Nazwa dnia tygodnia.
DD Dzień w miesiącu (1-31).
DDD Dzień w roku (1-366).
HH Godzina w dobie (1-12).
HH12 Godzina w dobie (1-12).
HH24 Godzina w dobie (0-23).
MI Minuta (0-59).
SS Sekunda (0-59).



To_char (dla dat)

to_char (date [,text1]) – zamienia datę na postać znakową według wzorca zawartego w ciągu text1.

Funkcję to_char można wykorzystać do przetwarzania dat wg wzorca. Od omawianej wcześniej odmiany to_char różni się rodzajem parametrów. Tutaj przyjmuje daty, wcześniej były to liczby.
W poniższym przykładzie wyświetliłem rok cyfrowo oraz rok słownie na podstawie daty systemowej korzystając ze wzorca.




Dla funkcji to_char stosuje się te same wzorce dat jak dla funkcji to_date.



Ćwiczenia



  1. Ile miesięcy upłynęło w okresie podanym powyżej?
  2. Ile dni ma luty w 2098 roku?
  3. Zaokrąglij datę która przypada za 148 miesięcy do jednego roku




Ten temat omawiam na poniższych szkoleniach:
Podstawy Oracle SQL
Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

10 komentarzy:

  1. "RRRR - (...) Wartości z zakresu 0-49 zwróci jako lata 20 wieku.
    Wartości z zakresu 50-99 zwróci jako lata 19 wieku."

    chyba chodziło o 21. i 20. wiek:)

    OdpowiedzUsuń
  2. mam problem z ćwiczeniami z tej lekcji ;/
    jakiś klucz może?

    OdpowiedzUsuń
  3. powiedz mi Andrzej.. dlaczego jak próbuje wstawic wartość "31-may-98" do kolumny typu date to dostaje błąd "a non-numeric character was found where a numeric was expected"?

    OdpowiedzUsuń
    Odpowiedzi
    1. A podaj inserta jakiego używasz to będę mógł Ci pomóc.

      Usuń
  4. Moje propozycje rozwiązań:

    1. Select months_between (sysdate, '2009/09/01') liczba_miesiecy from dual;
    2. Select last_day('2098/02/01') from dual;
    3. Select round(add_months(sysdate, 148),'year') from dual;

    OdpowiedzUsuń
  5. Jeśli się nie mylę - w przykładzie do "add_months" wkradł się bład - czy wynik nie powinien być 02/06/14?

    OdpowiedzUsuń
  6. 2.select (last_day(to_date('2098/02/01','yyyy/mm/dd'))+1)-to_date('2098/02/01','yyyy/mm/dd') from dual;

    OdpowiedzUsuń
  7. 1.select trunc(months_between(sysdate,'2009/01/01'),0) from dual;

    OdpowiedzUsuń
  8. Prawidłowe odpowiedzi:

    1. Select trunc(months_between(sysdate,’2009/09/01’)) from dual;
    2. Select to_char((last_day(‘2098/02/02’)), ‘dd’) from dual;
    3. Select round(add_months(sysdate, 148), ‘year’) from dual;

    OdpowiedzUsuń