CATEGORII DOCUMENTE |
Una dintre caracteristicile importante ale Oracle este abilitatea de a memora si opera cu date calendaristice. Tipurile de date calendaristice recunoscute de Oracle sunt:
DATE - valorile avand acest tip sunt memorate intr-un format intern specific, care include pe langa ziua, luna si anul, de asemenea ora, minutul, si secunda.
TIMESTAMP - valorile avand acest tip memoreaza data calendaristica, ora, minutul si secunda dar si fractiunea de secunda.
TIMESTAMP WITH [LOCAL] TIME ZONE - este similar cu TIMESTAMP, insa se va memora si diferenta de fus orar fata de ora universala, a orei de pe serverul bazei de date, sau a aplicatiei client, in cazul in care se include optiunea LOCAL
INTERVAL YEAR TO MONTH - memoreaza o perioada de timp in ani si luni.
INTERVAL DAY TO SECOND - memoreaza un interval de timp in zile, ore, minute si secunde.
Sa exemplificam aceste tipuri de date creand o tabela de test cu comanda:
create table test3
(data1 DATE, data2 TIMESTAMP(5),
data3 TIMESTAMP(5) WITH TIME ZONE,
data4 TIMESTAMP(5) WITH LOCAL TIME ZONE)
Vom insera acum o linie noua in aceasta tabela:
insert into test3
values(sysdate,systimestamp,systimestamp,systimestamp)
si la afisarea tabelei
select * from test3
vom obtine rezultatul din figura II.2.3.
DATA1 |
DATA2 |
DATA3 |
DATA4 |
27-FEB-07 |
27-FEB-07 05.49.35.02886 AM |
27-FEB-07 05.49.35.02886 AM -06:00 |
27-FEB-07 11.49.35.02886 AM |
Figura II.2.3
Oracle stie sa realizeze operatii aritmetice asupra datelor calendaristice, astfel adaugarea valorii la o data calendaristica, va duce la obtinerea urmatoarei date calendaristice:
SELECT sysdate, sysdate+5, sysdate-70 from dual
SYSDATE |
SYSDATE+5 |
SYSDATE-70 |
21-APR-07 |
26-APR-07 |
10-FEB-07 |
Figura II.2.4. Adunarea unui numar intreg la o data calendaristica
De asemenea se poate face diferenta dintre doua date calendaristice, obtinandu-se numarul de zile dintre cele doua date:
SELECT first_name, last_name,
hire_date, sysdate-hire_date
FROM employees
FIRST_NAME |
LAST_NAME |
HIRE_DATE |
SYSDATE-HIRE_DATE |
Steven |
King |
17-JUN-87 | |
Neena |
Kochhar |
21-SEP-89 | |
Lex |
De Haan |
13-JAN-93 | |
Alexander |
Hunold |
03-JAN-90 | |
Figura II.2.5. Diferenta dintre doua date calendaristice
Desi implicit o data calendaristica de tip DATE nu este afisata in format complet (nu se afiseaza ora, minutul, secunda), in tabela se memoreaza complet. De aceea poate fi uneori derutant rezultatul unor operatii aritmetice cu date calendaristice, dupa cum se vede in figura II.2.6. in care diferenta dintre ziua de astazi si cea de ieri este de
SELECT sysdate-TO_DATE('20-APR-07','dd-MON-yy') FROM dual
SYSDATE-TO_DATE('20-APR-07','DD-MON-YY') |
Figura II.2.6.
De ce se obtine acest lucru? Simplu, data de 20 aprilie a fost precizata fara ora, asadar a fost considerata implicit ora . Iar sysdate ne-a furnizat data curenta incluzand si ora. Asadar de ieri de la ora pana astazi la ora a trecut mai mult de o zi.
Oracle ofera un numar foarte mare de functii care opereaza asupra datelor calendaristice, dar in cele ce urmeaza ne vom opri asupra celor mai importante dintre acestea.
SYSDATE - returneaza data si ora curenta a serverului bazei de date.
CURRENT_DATE - returneaza data si ora curenta a aplicatiei client. Aceasta poate sa difere de data bazei de date.
SYSTIMESTAMP - returneaza data in formatul TIMESTAMP
select CURRENT_DATE, sysdate, systimestamp
from dual
CURRENT_DATE |
SYSDATE |
SYSTIMESTAMP |
21-APR-07 |
21-APR-07 |
21-APR-07 04.33.32.445081 AM -05:00 |
Figura II.2.7. Functiile SYSDATE CURRENT_DATE si SYSTIMESTAMP
ADD_MONTHS(data,nrluni) - adauga un numar de luni la data curenta. Daca al doilea parametru este un numar negativ, se realizeaza de fapt scaderea unui numar de luni din data precizata.
Exemplu |
Rezultatul afisat |
select sysdate, ADD_MONTHS(sysdate,2) from dual |
27-FEB-07 27-APR-07 |
select sysdate, ADD_MONTHS(sysdate,-2) from dual |
27-FEB-07 27-DEC-07 |
MONTHS_BETWEEN(data1,data2) - determina numarul de luni dintre doua date calendaristice precizate. Rezultatul returnat poate fi un numar real (vezi figura II.2.8). Daca prima data este mai mica (o data mai veche) atunci rezultatul va un numar negativ.
select sysdate, hire_date,
MONTHS_BETWEEN(sysdate, hire_date),
MONTHS_BETWEEN(hire_date, sysdate)
from employees
SYSDATE |
HIRE_DATE |
MONTHS_BETWEEN(SYSDATE,HIRE_DATE) |
MONTHS_BETWEEN(HIRE_DATE,SYSDATE) |
21-APR-07 |
17-JUN-87 | ||
21-APR-07 |
21-SEP-89 | ||
21-APR-07 |
13-JAN-93 | ||
21-APR-07 |
03-JAN-90 | ||
21-APR-07 |
21-MAY-91 | ||
Figura II.2.8. Functia MONTHS_BETWEEN
LEAST(data1,data2,.) - determina cea mai veche (cea mai mica) data dintre cele transmise ca parametru.
GREATEST(data1,data2,.) - determina cea mai recenta (cea mai mare) data dintre cele transmise ca parametru.
select hire_date,sysdate,
least(hire_date,sysdate),greatest(hire_date,sysdate)
from employees
HIRE_DATE |
SYSDATE |
LEAST(HIRE_DATE,SYSDATE) |
GREATEST(HIRE_DATE,SYSDATE) |
17-JUN-87 |
21-APR-07 |
17-JUN-87 |
21-APR-07 |
21-SEP-89 |
21-APR-07 |
21-SEP-89 |
21-APR-07 |
13-JAN-93 |
21-APR-07 |
13-JAN-93 |
21-APR-07 |
03-JAN-90 |
21-APR-07 |
03-JAN-90 |
21-APR-07 |
21-MAY-91 |
21-APR-07 |
21-MAY-91 |
21-APR-07 |
Figura II.2.9. Functiile LEAST si GEATEST
NEXT_DAY(data, 'ziua') - returneaza urmatoarea data de 'ziua' de dupa data transmisa ca parametru, unde 'ziua' poate fi 'Monday' 'Tuesday' etc. In exemplele care urmeaza data curenta este considerata ziua de marti, 27 februarie 2007.
LAST_DAY(data) - returneaza ultima zi din luna din care face parte data transmisa ca parametru.
Exemplu |
Rezultatul afisat |
select next_day(sysdate,'Friday') from dual |
02-MAR-07 |
select next_day(sysdate,'TUESDAY') from dual |
06-MAR-07 Explicatie. Chiar daca ziua curenta este o zi de marti, functia va returna urmatoarea zi de marti. |
select last_day(sysdate) from dual |
28-FEB-07 |
select last_day(sysdate+20) from dual |
31-MAR-07 |
select last_day(ADD_MONTHS(sysdate,12)) from dual |
29-FEB-07 Explicatie. Ziua returnata de sysdate este 27-FEB-07, la care adaugam luni, deci obtinem data de 27-FEB-08, iar anul este un an bisect de aceea ultima zi din luna este 29-FEB-08 |
ROUND(data,'format') - daca nu se precizeaza formatul, functia rotunjeste data transmisa ca parametru la cea mai apropiata ora 12 AM, adica daca ora memorata in data este inainte de miezul zilei atunci se va returna ora 12 AM a datei transmise. Daca ora memorata in data este dupa miezul zilei se va returna ora 12 AM a zilei urmatoare.
select to_char(sysdate,'dd-MON-YY hh:mi AM'),
round(sysdate) from dual
TO_CHAR(SYSDATE,'DD-MON-YYHH:MIAM') |
ROUND(SYSDATE) |
21-APR-07 04:41 AM |
21-APR-07 |
Figura II.2.10. Functia ROUND
In cazul in care este specificat formatul, data va fi rotunjita conform formatului indicat. Cateva dintre formatele cele mai uzuale sunt:
y yy yyyy year - se rotunjeste data la cea mai apropiata data de 1 Ianuarie. Daca data este inainte de 1 iulie, se va returna data de 1 ianuarie a aceluiasi an. Daca data este dupa data de 1 iulie se va returna data de 1 ianuarie a anului urmator.
mm month - rotunjeste data la cel mai apropiat inceput de luna. Orice data calendaristica aflata dupa data de , inclusiv, este rotunjita la prima zi a lunii urmatoare.
ww week - se rotunjeste data la cel mai apropiat inceput de saptamana. Prima zi a saptamanii este considerata lunea. Pentru datele aflate dupa ziua de joi, inclusiv, se va returna ziua de luni a saptamanii urmatoare.
Exemplu |
Rezultatul afisat |
select sysdate, round(sysdate,'year'), round(ADD_MONTHS(sysdate,5),'year') from dual |
27-FEB-07 01-JAN-07 01-JAN-08 |
select sysdate, round(sysdate,'mm'), round(sysdate+16,'mm'), round(sysdate+17,'mm') from dual |
27-FEB-07 01-MAR-07 01-MAR-07 01-APR-07 |
select sysdate, round(sysdate,'ww'), round(sysdate+1,'ww'), round(sysdate+2,'ww') from dual |
27-FEB-07 26-FEB-07 26-FEB-07 05-FEB-07 |
TRUNC(data,'format') - truncheaza data specificata conform formatului specificat. Se pot folosi aceleasi formate ca si in cazul functiei ROUND
Exemplu |
Rezultatul afisat |
select sysdate, trunc(sysdate,'year'), trunc(ADD_MONTHS(sysdate,5),'year') from dual |
27-FEB-07 01-JAN-07 01-JAN-07 |
select sysdate, trunc(sysdate,'month'), trunc(sysdate+16,'month'), trunc(sysdate+17,'month') from dual |
27-FEB-07 01-FEB-07 01-MAR-07 01-MAR-07 |
select sysdate, trunc(sysdate,'ww'), trunc(sysdate+1,'ww'), trunc(sysdate+2,'ww') from dual |
27-FEB-07 26-FEB-07 26-FEB-07 26-FEB-07 |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 4276
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved