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
YOstatnie 3,2 lub 1 cyfra roku. IYY
IY
IOstatnie 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
- Ile miesięcy upłynęło w okresie podanym powyżej?
- Ile dni ma luty w 2098 roku?
- 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.
"RRRR - (...) Wartości z zakresu 0-49 zwróci jako lata 20 wieku.
OdpowiedzUsuńWartości z zakresu 50-99 zwróci jako lata 19 wieku."
chyba chodziło o 21. i 20. wiek:)
mam problem z ćwiczeniami z tej lekcji ;/
OdpowiedzUsuńjakiś klucz może?
już ogarnięte ;)
OdpowiedzUsuń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ńA podaj inserta jakiego używasz to będę mógł Ci pomóc.
UsuńMoje propozycje rozwiązań:
OdpowiedzUsuń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;
Ten komentarz został usunięty przez autora.
UsuńJeśli się nie mylę - w przykładzie do "add_months" wkradł się bład - czy wynik nie powinien być 02/06/14?
OdpowiedzUsuń2.select (last_day(to_date('2098/02/01','yyyy/mm/dd'))+1)-to_date('2098/02/01','yyyy/mm/dd') from dual;
OdpowiedzUsuń1.select trunc(months_between(sysdate,'2009/01/01'),0) from dual;
OdpowiedzUsuńPrawidłowe odpowiedzi:
OdpowiedzUsuń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;
Select
OdpowiedzUsuńtrunc(months_between(sysdate, to_date('2009-09-01','yyyy-mm-dd'))) AD1,
to_char(last_day(to_date('2098-02-02','yyyy-mm-dd')),'dd') AD2,
to_char(round(add_months(sysdate, 148),'year'),'yyyy') AD3
from dual