tip timestamp kod oracle sql-a i njegovo koriscenje

16
Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje Saša Kostić

Upload: sasak

Post on 10-Aug-2015

61 views

Category:

Documents


5 download

DESCRIPTION

Karakteristike Timestamp tipa podatka u Oracle DBMS-u.

TRANSCRIPT

Page 1: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a

i njegovo korišćenje

Saša Kostić

Page 2: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

2

Sadržaj

1. Uvod ....................................................................................................................................... 3

2. Tipovi podataka u PL/SQL-u ................................................................................................. 3

3. Date/Time tipovi podataka ..................................................................................................... 3

4. TIMESTAMP tipovi podataka ............................................................................................... 4

4.1. TIMESTAMP ......................................................................................................................................... 4

4.2. TIMESTAMP WITH TIME ZONE ....................................................................................................... 5

4.3. TIMESTAMP WITH LOCAL TIME ZONE ......................................................................................... 6

4.4. Efekti različitih DATETIME tipova podataka........................................................................................ 6

5. Date/Time Funkcije ................................................................................................................ 7

5.1. Funkcije za očitavanje podataka o datumu i vremenu ............................................................................ 8

5.2. Neke funkcije za rad sa vremenskim zonama ......................................................................................... 9

5.3. Familija funkcija TO_TIMESTAMP ................................................................................................... 10

5.4. TIMESTAMP literali............................................................................................................................ 11

5.5. Funkcija TO_CHAR ............................................................................................................................. 12

5.6. Funkcija EXTRACT ............................................................................................................................. 12

5.7. Funkcija FROM_TZ ............................................................................................................................. 13

6. Zaključak .............................................................................................................................. 15

Literatura .................................................................................................................................. 16

Page 3: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

3

1. Uvod

Tip podataka je konstrukcija koja definiše format skladištenja, ograničenja i opseg

promenljivih, parametara i ograničenja.

Oracle SQL je oduvek podržavao veliki broj tipova podataka. Do verzija Oracle8i, kao

i u prethodnim verzijama, rad se svodio na upotrebu NUMBER, CHAR, VARCHAR2, BOOLEAN

itd. Od verzije 9i, Oracle uključuje mnoge varijacije ovih tipova podataka kao i neke dodatne

tipove koji nisu dostupni u prethodnim verzijama Oracle SQL-a. Pre verzije Oracle9i rad sa

„vremenima“ se svodio na upotrebu tipa DATE, a od ove verzije (maj 2000. godine) imamo na

raspolaganju između ostalih i tip TIMESTAMP.

2. Tipovi podataka u PL/SQL-u

U PL/SQL-u možemo izdvojiti četiri glavne grupe tipova podataka. Njihov kratki

pregled je dat u nastavku.

Skalarni tipovi podataka predstavljaju vrednosti koje ne mogu biti podeljene na

delove. Ovde spadaju: numerički tipovi podataka (služe za predstavljanje brojeva), znakovni

(koriste se za tekstualne informacije), informacije o datumu/vremenu (ovo će biti opisano

opširnije u nastavku) i boolean tipovi podataka (koji su uobičajeni elementi logičkih

operacija).

Kompozitni tipovi podataka podrazumevaju interne komponente kojima se može

nezavisno manipulisati. Npr. %ROWTYPE je primer PL/SQL RECORD tipa podatka.

Reference sadrže pokazivače na druge sadržaje programa.

Veliki objekti skladište ili pokazuju na velike količine tekstualnih ili binarnih

informacija, kao što su slike, video i sl.

3. Date/Time tipovi podataka

Date/Time podaci su oni koji čuvaju informacije o određenom vremenskom trenutku.

Ovakvi podaci su specificirani korišćenjem grupe tipova podataka koji omogućavaju

skladištenje vremenske markice (vremenske oznake, eng. „timestamp“) nekog događaja ili

vremenskog intervala, a može da uključuje: datum, sat, minut, sekundu, delove sekunde i

vremensku zonu.

Oracle DBMS pruža tri grupe ovakvih tipova:

DATE

TIMESTAMP

INTERVAL

kao i brojne ugrađene funkcije za rad sa ovakvim podacima.

Iako je ovde tema TIMESTAMP tip podataka, treba reći nešto i o tipu DATE. Pre verzije

Oracle9i, samo je DATE tip podataka dozvoljavao skladištenje vremenskog trenutka, tj. i

datum i vreme. Čak i danas Oracle nema odvojene tipove podataka za datum i za vreme, mada

to neki drugi DBMS-ovi podržavaju.

DATE je najprostiji i najkorišćeniji tip podataka za rad sa vremenom.

Page 4: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

4

4. TIMESTAMP tipovi podataka

Iako se DATE tip podataka koristi godinama, on ima i brojna ograničenja. Ovo je

razlog što je Oracle uveo tip podataka TIMESTAMP, koji prevazilazi ograničenja koje ima

DATE.

Postoje tri varijante TIMESTAMP tipova podataka:

TIMESTAMP

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONE

4.1. TIMESTAMP

Pamti datum i vreme bez informacija o vremenskoj zoni. Sem što ima informaciju o

vremenu u milijarditom delu sekunde, ekvivalentan je tipu DATE. Prosto rečeno, TIMESTAMP

dozvoljava specifikaciju vremena u delovima sekunde (dok je DATE ograničen na cele

sekunde).

Ova osobina može biti veoma korisna ako nam trebaju detaljnije informacije o

sekvencijalnim procesima, zato što sada možemo porediti događaje koji su se dogodili

tokom iste sekunde. Podrazumevano je da Oracle skladišti ove informacije sa 6 decimala

preciznosti, ali se može podesiti bilo koja tačnost od 0 do 9 decimala, tj. može biti izmedju 7 i

11 bajtova u memoriji. Dakle, preciznost može da se kreće čak do nanosekunde (0.000000001

sekunde), a podrezumevana vrednost (default) je preciznost od mikrosekunde (0.000001

sekundi). Pri tome, TIMESTAMP(0) je ekvivalentan tipu DATE.

Za razliku od tipa DATE, kada se za TIMESTAMP računa kolika je vremenska razlika

između dva trenutka u vremenu, rezultat nije predstavljen kao broj sati, kao kod DATE tipa, pa

da programer mora odatle da izvlači dalje informaciju koliko je npr. dana prošlo između, kod

TIMESTAMP-a je to jednostavnije rešeno, kao u primeru:

SELECT time1, time2, (time2-time1)

FROM date_table

TIME1 TIME2 (TIME2-TIME1)

---------------------- ---------------------- ---------------------

06/20/2003:16:55:14:00 07/08/2003:11:22:57:00 +000000017 8:27:43.00

06/26/2003:11:16:36:00 07/08/2003:11:22:57:00 +000000012 0:06:21.00

Da smo koristili tip DATE da označimo ova dva vremenska trenutka, kao rezultat za

razliku TIME2-TIME1 dobili bismo broj sati između dva DATE-a, a sa TIMESTAMPOM smo dobili

mnogo čitljiviji oblik.

Ovaj tip deklarišemo na sledeći način: variable_ts TIMESTAMP[(precision)];

Primer smeštanja trenutnog sistemskog vremena u TIMESTAMP i čitanja iz TIMESTAMP-

a za štampu na ekranu:

Page 5: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

5

SQL> declare

2 v_ts TIMESTAMP(6):=systimestamp;

3 v_tx VARCHAR2(2000);

4 begin

5 v_tx:=to_char(v_ts,’HH24:MI:SS.FF6’);

6 DBMS_OUTPUT.put_line(v_tx);

7 end;

8 /

15:39:51.812000

PL/SQL procedure successfully completed.

SQL>

Dakle u liniji 2 smo koristili SYSTIMESTAMP da bismo očitali vrednost sistemskog

vremena sa preciznošću TIMESTAMP, a ne SYSDATE koji bi nam dao vrednost sa preciznošću

DATE.

Format za masku je prikazan u liniji 5, gde FF[1-9] predstavlja frakcije (delove)

sekunde. Ako se navede manja preciznost nego što je zapamćena, Oracle koristi istu tehniku

zaokruživanja kao kod brojeva sa pokretnom zapetom.

4.2. TIMESTAMP WITH TIME ZONE

Još jedno ograničenje tipa DATE je što on nema evidenciju o vremenskoj zoni. Ovo

može biti problem ako se korisnici istog sistema, tj. iste baze podataka, nalaze u više različitih

vremenskih zona. Ako bi koristili tip DATE u ovakvim slučajevima, morali bismo negde

„ugraditi“ sopstvenu logiku koja bi vodila računa o lokaciji korisnika i/ili baze podataka.

Dakle prednost tipa TIMESTAMP WITH TIME ZONE je što pamti i podatke o vremenskoj zoni uz

podatke o datumu i vremenu.

Ovaj tip deklarišemo na sledeći način: variable_ts TIMESTAMP[(precision)] WITH TIME ZONE;

Primer za korišćenje podatka tipa timestamp with time zone:

SQL> declare

2 v_ts TIMESTAMP(6) WITH TIME ZONE 3 :=CURRENT_TIMESTAMP; 4 v_tx VARCHAR2(2000);

5 begin

6 v_tx:=to_char(v_ts,’HH24:MI:SS.FF6 TZR’); 7 DBMS_OUTPUT.put_line(v_tx);

8 v_tx:=to_char(v_ts,’TZH TZM’);

9 DBMS_OUTPUT.put_line(v_tx);

10 end;

11 /

17:50:42.828000 -05:00 -05 00

PL/SQL procedure successfully completed.

SQL>

U linijama koda 2 i 3 ugrađena funkcija CURRENT_TIMESTAMP daje TIMESTAMP

vremenske zone sesije (tj. klijenta), ali ne i zonu baze podataka. Ovo je iz razloga što se sesije

odigravaju između aplikacionog servera i servera baze podataka pa ne možemo koristiti

Page 6: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

6

TIMESTAMP WITH TIME ZONE jer je klijent samo Web-browser koji nema konekciju ka

Oracle-u.

U 6. liniji maska formata TZR vraća informaciju o vremenskoj zoni. U zavisnosti od

podešavanja BP, to može biti vremenska razlika između vremenske zone sesije i UTC, ili ime

regiona.

Ako je potrebna samo vremenska razlika može se koristiti TZH i TZM (linija 7), koji

vraćaju razliku u satima, odnosno u minutima (respektivno).

U liniji 12 prikazan je primer rezulatat upita iz linije 6.

4.3. TIMESTAMP WITH LOCAL TIME ZONE

Skladišti datum i vreme za koje se pretpostavlja da su u lokalnoj vremenskoj zoni. Za

kolonu baze podataka ovog tipa, „lokalna“ vremenska zona je vremenska zona baze podataka.

Za PL/SQL promenljive ovog tipa, „lokalna“ vremenska zona je vremenska zona sesije.

Vrednosti koje se prebacuju između kolone baze podataka i PL/SQL promenljivih se

konvertuju iz jedne vremenske zone u drugu.

4.4. Efekti različitih DATETIME tipova podataka

Razlike između ove tri varijante možda nisu vidljive i razumljive na prvi pogled. To

se, pre svega, odnosi na TIMESTAMP WITH LOCAL TIME ZONE koji je malo komplikovaniji.

Na Slici 1 prikazane su razlike između različitih DATETIME podataka koji se

„premeštaju“ od korisnika u jednoj vremenskoj zoni (Jonathan) kroz bazu podataka do

korisnika u drugoj vremenskoj zoni (Donna).

Jonathan kasni 5 sati u odnosu na univerzalno vreme (UTC). On smešta iste DATETIME

vrednosti u četiri polja baze podataka korišćenjem ANSI/ISO standardnu notaciju vrednosti

3:00 PM, Eastern Standard Time (-5:00), 6. februar 2002. Baza podataka u ovom primeru se

nalazi u Mountain Standard Time zoni.

Ovde dolaze do izražaja fine razlike među ovim DATETIME tipovima podataka.

DATE i TIMESTAMP ignorišu podatke o razlikama u vremenskim zonama, tj. uopšte i ne

pamte vremensku zonu, s tim što DATE ne pamti ni delove sekunde.

TIMESTAMP WITH TIME ZONE čuva informaciju o zoni, i to tako što se u bazu podataka

smešta vreme koje je kod Jonathana, ali sa informacijom o vremenskoj razlici u odnosu na

UTC.

U odnosu na prethodni tip, TIMESTAMP WITH LOCAL TIME ZONE se razlikuje u tome što

se vreme koje je Jonathan uneo korektno pamti u vremenskoj zoni u kojoj je baza podataka,

ali se i gubi informacija o vremenskoj zoni.

Page 7: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

7

Slika 1: Efekti različitih DATETIME tipova podataka

5. Date/Time Funkcije

Aritmetika sa DATE tipom podataka ne pruža svu funkcionalnost koja je potrebna u

radu sa DATETIME vrednostima. Iz ovog razloga PL/SQL implementira brojne dodatne

funkcije za rad sa njima.

Pregled ovih funkcija sa kraćim opisom dat je u sledećoj tabeli.

Tabela 1: Ugrađene funkcije za rad sa datumom

Naziv funkcije Opis ADD_MONTHS Dodaje određeni broj meseci datumu.

CURRENT_DATE Vraća trenutni datum i vreme kao DATE vrednost u vremenskoj

zoni sesije.

CURRENT_TIMESTAMP Vraća trenutni datum i vreme kao TIMESTAMP WITH TIME ZONE

vrednost u vremenskoj zoni sesije.

DBTIMEZONE Vraća razliku vremenske zone baze podataka u odnosu na UTC

vremensku zonu kao string karaktera (npr. ‘-05:00’).

FROM_TZ Dodaje informaciju o vremenskoj zoni TIMESTAMP vrednosti,

konvertujući je u TIMESTAMP WITH TIME ZONE. LAST_DAY(date) Vraća polednji dan u mesecu koji sadrži navedeni datum.

LOCALTIMESTAMP Vraća trenutni datum i vreme kao TIMESTAMP vrednost u

lokalnoj vremenskoj zoni. MONTHS_BETWEEN Izračunava broj meseci između dva datuma. NEW_TIME Pomera DATE vrednost iz jedne vremenske zone u drugu.

NEXT_DAY Vraća datum prvog navedenog vikenda koji je posle određenog

datuma. ROUND Vraća datum zaokružen na naveden način formatiranja.

Page 8: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

8

Naziv funkcije Opis

SESSIONTIMEZONE Vraća razliku vremenske zone sesije u odnosu na UTC

vremensku zonu kao string karaktera (npr. ‘-05:00’).

SYSDATE Vraća trenutni datum i vreme sa Oracle-ovog servera kao DATE

vrednost.

SYSTIMESTAMP Vraća trenutni datum i vreme sa Oracle-ovog servera kao

TIMESTAMP WITH TIME ZONE vrednost. TRUNC Odseca DATE vrednost na naveden način formatiranja.

TZ_OFFSET

Vraća vremensku razliku za dato ime, skraćenicu ili pomeraj

navedene vremenske zone u odnosu na UTC

(npr. ‘-05:00’)

Treba biti obazriv, jer za povratne vrednosti nekih od ovih funkcija Oracle implicitno

vrši konverziju u tip DATE. Dakle, treba izbegavati korišćenje standardnih Oracle funkcija za

rad nad podacima tipa DATE, kada radimo sa podacima tipa TIMESTAMP, jer se pri tome mogu

izgubiti informacije koje TIMESTAMP nosi o tačnošću vremena u delovima sekunde, kao i o

vremenskoj zoni.

U nastavku će biti reči o onim funkcijama koje se odnose na rad sa TIMESTAMP tipom

podataka.

5.1. Funkcije za očitavanje podataka o datumu i vremenu

Rad sa podacima koji nose informacije o datumu i vremenu može predstavljati

problem. Neke funkcije vraćaju DATE, neke TIMESTAMP ili čak TIMESTAMP WITH TIME ZONE.

Da bi izbor funkcija bio lakši i tip njihovih povratnih vrednosti pregledniji, u Tabeli 2 dat je

pregled funkcija sa povratnim tipovima.

Tabela 2: Poređenje funkcija koje vraćaju datum i vreme

Naziv funkcije Vremenska zona Tip podataka CURRENT_DATE Session DATE

CURRENT_TIMESTAMP Session TIMESTAMP WITH TIME ZONE

LOCALTIMESTAMP Session TIMESTAMP

SYSDATE Server DATE

SYSTIMESTAMP Server TIMESTAMP WITH TIME ZONE

Prve tri vraćaju vrednost koja sadrži informaciju o časovnoj zoni sesije, a zadnje dve

časovnoj zoni servera. Pružena je mogućnost da izaberemo koji nam izlaz najviše odgovara, i

pri tom izboru trebamo obratiti pažnju na sledeće stvari: da li nam je potrebna preciznost

TIMESTAMP-a ili je dovoljna preciznost tipa DATE za naše potrebe, i da li nam je potrebna

informacija o časovnoj zoni (i da li je to časovna zona sesije ili servera). Još jedna stvar na

koju možemo da obratimo pažnju je i kompatibilnost sa verzijama koje su prethodile Oracle-u

9i (tada koristimo samo SYSDATE). Kada odgovorimo na ova pitanja, znaćemo koja funkcija

od ovih 5 nam treba.

U nastavku je dat primer razlike između CURRENT_TIMESTAMP i SYSTIMESTAMP

funkcija:

Page 9: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

9

BEGIN

DBMS_OUTPUT.PUT_LINE(CURRENT_TIMESTAMP);

DBMS_OUTPUT.PUT_LINE(SYSTIMESTAMP);

END;

Dobijene vrednosti su: 24-FEB-02 04.55.54.803009000 PM -08:00

24-FEB-02 07.55.54.804221000 PM -05:00

5.2. Neke funkcije za rad sa vremenskim zonama

Nekada je potrebno da znamo u kojoj vremenskoj zoni se nalaze sesija ili baza

podataka. Takođe, nekad nam je potrebna vremenska razlika između date zone i UTC zone.

Oracle DBMS može detektovati vremensku zonu. Za ove namene koriste se sledeće funkcije:

DBTIMEZONE,

SESSIONTIMEZONE,

TZ_OFFSET(time_zone).

DBTIMEZONE i SESSIONTIMEZONE, vraćaju vremensku zonu baze podataka, odnosno

sesije (vremensku zonu na računaru klijenta), respektivno, u tipu VARCHAR2, kao pomeraj u

odnosu na UTC vremensku zonu.

Primer: BEGIN

DBMS_OUTPUT.PUT_LINE(DBTIMEZONE);

DBMS_OUTPUT.PUT_LINE(SESSIONTIMEZONE);

END;

Izlaz: -07:00

-08:00

Ako želimo da znamo šta ovi pomeraji zaista predstavljaju, koristićemo

V$TIMEZONE_NAMES (koji vraća listu imena i skraćenica vremenskih zona).

TZ_OFFSET(time_zone) koristimo da dobijemo pomeraj vremenske zone za određeni

region (vraća VARCHAR2). U sledećem primeru dobijamo listu svih regiona koji imaju pomeraj

vremenskih zona od -07:00.

SELECT TZNAME, TZABBREV

FROM V$TIMEZONE_NAMES

WHERE SUBSTR(TZ_OFFSET(TZNAME),1,6) = '-07:00';

TZNAME TZABBREV

-------------------- ---------

America/Denver LMT

America/Denver MST

America/Denver MWT

America/Denver MDT

America/Edmonton LMT

America/Edmonton MST

America/Edmonton MDT

Page 10: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

10

Funkciju SUBSTR je poželjno koristiti nad funkcijom TZ_OFFSET zbog greške koja se

javlja pri upotrebi ove funkcije u Oracle 9i (Release 1 verziji DBMS-a), jer funkcija

TZ_OFFSET greškom (zbog bug-a) postavlja dodatnu nulu na kraju rezultata (tj. povratnog

niza), što može izazvati probleme. SUBSTR odseca ovu nulu, tako da je ponašanje tada uvek

ono očekivano.

5.3. Familija funkcija TO_TIMESTAMP

Pošto postoje tri različita tipa Timestamp-a, imamo i tri odgovarajuće ugrađene

funkcije za konverziju stringova u Timestamp vrednost:

TO_TIMESTAMP

TO_TIMESTAMP_TZ

TO_TIMESTAMP_LTZ

Specifikacija za svaku od tri funkcije prati sličan obrazac kao sledeći:

FUNCTION TO_TIMESTAMP (

string_in IN VARCHAR2

[, format_mask IN VARCHAR2

[, nls_language IN VARCHAR2 ]]

)

RETURN DATE;

string_in – string koji predstavlja vrednost vremenskog trenutka koji unosimo.

format_mask – opisuje format za prethodni parametar (string_in) . Ta maska za format

ima kao podrazumevanu vrednost (pošto može da se izostavi) jedan od sledeća dva formata,

zavisno od toga za koji tip Timestamp-a vršimo konverziju. To je jedan od ovih formata:

NLS_TIMESTAMP_FORMAT (za TO_TIMESTAMP i TO_TIMESTAMP_LTZ)

NLS_TIMESTAMP_TZ_FORMAT (za TO_TIMESTAMP_TZ)

nls_language – specificira jezik koji će se koristiti za interpretaciju za nazive i

skraćenice dana i meseci u prvom parametru string_in.

NLS predstavlja skraćenicu za National Language Support.

Primer:

DECLARE

a TIMESTAMP;

b TIMESTAMP;

c TIMESTAMP WITH TIME ZONE;

d TIMESTAMP WITH TIME ZONE;

BEGIN

a := TO_TIMESTAMP('24-Feb-2002 09.00.00.50 PM');

b := TO_TIMESTAMP('02/24/2002 09:00:00.50PM',

'mm/dd/yyyyhh:mi:ssxff AM');

c := TO_TIMESTAMP_TZ('1999-12-0111:00:00-8:00',

'YYYY-MM-DDHH:MI:SSTZH:TZM');

d := TO_TIMESTAMP_TZ('2002-06-18 13:52:00.123456789

US/Eastern EDT', 'YYYY-MM-DD HH24:MI:SS.FF TZR TZD');

DBMS_OUTPUT.PUT_LINE(a);

DBMS_OUTPUT.PUT_LINE(b);

DBMS_OUTPUT.PUT_LINE(c);

Page 11: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

11

DBMS_OUTPUT.PUT_LINE(d);

END;

Izlaz bi bio:

24-FEB-02 09.00.00.500000 PM

24-FEB-02 09.00.00.500000 PM

01-DEC-99 11.00.00.000000 AM -08:00

2002-06-18 01:52:00.123457000 PM -04:00 US/EASTERN EDT

Nije loše obratiti pažnju na treću promenljivu, “c”, koja sadrži i informaciju o

časovnoj zoni, odnosno položaj u odnosu na UTC, gde je ovaj pomeraj +0 sati, dok je u

četvrtoj primenjen naziv časovne zone.

Ova vrednost može da se kreće između -12:59 i +13:59. To je onaj deo koji u masci

označava TZH:TZM.

Umesto nje, možemo upotrebiti i sam naziv časovne zone, ako na kraju maske

navedemo TZR, kao u sledećem primeru:

TO_TIMESTAMP_TZ ('27-Oct-2002 01:30:00.00 America/Detroit',

'dd-Mon-yyyy hh:mi:ssxff TZR')

Kao što se vidi, sada smo umesto broja sati naveli America/Detroit časovnu zonu,

mada je preporučeno da se koristi prvi način, sa navođenjem broja sati.

5.4. TIMESTAMP literali

U PL/SQL programima možemo koristiti Timestamp literale, i oni se formiraju na

sledeći način:

TIMESTAMP 'YYYY-MM-DD HH:MI:SS[.FFFFFFFFF] [{+|-}HH:MI]'

Dakle, navedemo prvo ključnu reč TIMESTAMP, a zatim masku, gde delovi sekunde

mogu biti opcioni, kao i pomeraj za časovnu zonu (Time zone displacement), tj. ovaj deo

“HH:MI”.

Primer:

DECLARE

a TIMESTAMP WITH TIME ZONE;

b TIMESTAMP WITH TIME ZONE;

c TIMESTAMP WITH TIME ZONE;

d TIMESTAMP WITH TIME ZONE;

e TIMESTAMP WITH TIME ZONE;

f TIMESTAMP WITH TIME ZONE;

BEGIN

-- dve pozicije za delove sekunde:

a := TIMESTAMP '2002-02-19 11:52:00.00 -05:00';

-- devet pozicija za delove sekunde:

b := TIMESTAMP '2002-02-19 14:00:00.000000000 -5:00';

Page 12: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

12

-- bez delova sekunde:

c := TIMESTAMP '2002-02-19 13:52:00 -5:00';

/* nije navedena časovna zona, pridružuje se vremenska

zona koja je „po default-u“ za sesiju */

d := TIMESTAMP '2002-02-19 13:52:00';

-- e i f predstavljaju istu vrednost

e := TIMESTAMP '2002-02-19 10:52:00 -8:00';

f := TIMESTAMP '2002-02-19 13:52:00 EST';

END;

Možemo da obratimo pažnju na promenljive “e” i “f”, koje imaju istu vrednost, a koja

je unesena na dva različita načina, kao što se u primeru vidi.

5.5. Funkcija TO_CHAR

Ova funkcija može da se primeni na TIMESTAMP tip podatka isto kao i na DATE. Koristi

se za konverziju ovih tipova podataka u string.

FUNCTION TO_CHAR(

date_in IN DATE

[, format_mask IN VARCHAR2

[, nls_language IN VARCHAR2]]

)

RETURN VARCHAR2

date_in – DATE podatak, ali može i TIMESTAMP, koji će se konvertovati u string

format_mask – maska koja se sastoji od jednog ili više elemenata za formatiranje

datuma, koji će biti prikazani u rezlultujućem stringu, tipa VARCHAR2

nls_language – kao i kod trećeg parametra funkcije TO_TIMESTAMP, specificira jezik u

kome će datum biti prilazan.

Ako maska nije specificirana, koristiće se ona koja je podrazumevana vrednost,

NLS_DATE_FORMAT, osim ako mi eksplicitno ne promenimo to na sledeći način:

ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY';

Primer za upotrebu ove funkcije nad podatkom tipa TIMESTAMP: TO_CHAR (A_TIMESTAMP, 'YYYY-MM-DD HH:MI:SS.FF AM TZH:TZM')

Dobiće se rezultat npr. ovakvog oblika: 2002-02-19 01:52:00.123457000 PM -05:00

5.6. Funkcija EXTRACT

Funkcija Extract se koristi da se izvuku određeni delovi informacije koju čuva podatak

o vremenskom trenutku. Sledećeg je oblika:

EXTRACT (component_name, FROM {datetime | interval})

Page 13: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

13

component_name – je naziv dela podatka koji želimo da izvučemo zasebno iz tipa

podatka koji čuva informacije o vremenskom trenutku, i taj naziv component_name može

uzeti sledeće vrednosti:

Tabela 3: Imena komponenti koje možemo koristiti uz EXTRACT

Ime komponente Povratni tip YEAR NUMBER

MONTH NUMBER

DAY NUMBER

HOUR NUMBER

MINUTE NUMBER

SECOND NUMBER

TIMEZONE_HOUR NUMBER

TIMEZONE_MINUTE NUMBER

TIMEZONE_REGION VARCHAR2

TIMEZONE_ABBR VARCHAR2

Primer: SQL>

2 EXTRACT(HOUR FROM TO_TIMESTAMP('01-JAN-2005 19:15:26',

3 'DD-MON-YYYY HH24:MI:SS')) AS HOUR,

4 EXTRACT(MINUTE FROM TO_TIMESTAMP('01-JAN-2005 19:15:26',

5 'DD-MON-YYYY HH24:MI:SS')) AS MINUTE,

6 EXTRACT(SECOND FROM TO_TIMESTAMP('01-JAN-2005 19:15:26',

7 'DD-MON-YYYY HH24:MI:SS')) AS SECOND

8 FROM dual;

Izlaz je: HOUR MINUTE SECOND

---------- ---------- ----------

19 15 26

Ili, drugi koristan način da upotrebimo ovu funkciju:

BEGIN

IF EXTRACT (MONTH FROM SYSDATE) = 12 THEN

DBMS_OUTPUT.PUT_LINE('Sad je Decembar');

ELSE

DBMS_OUTPUT.PUT_LINE('Sad nije Decembar');

END IF;

END;

Pošto ova funkcija uglavnom vraća vrednost tipa NUMBER, korisna je kada su nam ovi

parametri potrebni da bismo isprogramirali neko ponašanje, gde su ovi brojevi upotrebljiviji.

Ako su nam potrebni nazivi dana i meseci, pogodnija je upotreba funkcije TO_CHAR.

5.7. Funkcija FROM_TZ

Ova FUNKCIJA dodaje promenljivoj tipa TIMESTAMP informaciju o časovnoj zoni, i

zajedno sa tim i konvertuje datu TIMESTAMP promenljivu u promenljivu tipa TIMESTAMP WITH

TIME ZONE.

Page 14: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

14

Specifikacija funkcije je ovakva:

FUNCTION FROM_TZ (

timestamp_value IN TIMESTAMP,

time_zone IN VARCHAR2

)

timestamp_value – promenljiva tipa TIMESTAMP kojoj želimo da dodamo informaciju o

časovnoj zoni

time_zone – informacija o časovnoj zoni, koja može biti predstavljena u 2 oblika: kao

pomeraj u odnosu na UTC vreme (+-sati i minuti), ili kao naveden naziv časovne zone.

Primer: DECLARE

w TIMESTAMP:= TO_TIMESTAMP ('24-Jun-2002 3.41.00.00 PM');

x TIMESTAMP WITH TIME ZONE;

y TIMESTAMP WITH TIME ZONE;

BEGIN

x := FROM_TZ(w,'-5:00');

y := FROM_TZ(w,'US/Eastern');

DBMS_OUTPUT.PUT_LINE(x);

DBMS_OUTPUT.PUT_LINE(y);

END;

Izlaz bi izgledao ovako: 24-JUN-02 03.41.00.000000 PM -05:00

24-JUN-02 03.41.00.000000 PM US/EASTERN

Kao što se da primetiti, početna vrednost za promenljivu „w” se nije promenila, samo

je proširena informacijom o časovnoj zoni, i sada je tipa TIMESTAMP WITH TIME ZONE.

U Oracle-u možemo vršiti i eksplicitnu konverziju tipova uz pomoć funkcije CAST.

Na primer: DECLARE

a TIMESTAMP;

b TIMESTAMP;

BEGIN

a := CAST(SYSTIMESTAMP AS TIMESTAMP);

b := SYSDATE;

DBMS_OUTPUT.PUT_LINE(TO_CHAR(a,'DD-MON-YYYY HH:MI:SS.FF6 AM'));

DBMS_OUTPUT.PUT_LINE(TO_CHAR(b,'DD-MON-YYYY HH:MI:SS.FF6 AM'));

END;

Dobijene vrednosti su: 24-FEB-2002 06:46:39.029000 PM

24-FEB-2002 06:46:39.000000 PM

Poziv SYSTIMESTAMP vraća tip TIMESTAMP WITH TIME ZONE, ali koristimo CAST da

izvršimo konverziju u TIMESTAMP eksplicitno. Poziv SYSDATE dozvoljava da se konverzija iz

DATE u TIMESTAMP izvršava implicitno.

Page 15: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

15

6. Zaključak

Tip podataka TIMESTAMP treba koristiti onda kada želimo da imamo veću preciznost

za vremenski trenutak ili kada radimo sa vremenom u različitim časovnim zonama. Za manju

preciznost treba koristiti jednostavniji tip podataka DATE.

Pokazali smo da iako nije uvek neophodno koristiti tip podataka TIMESTAMP, ovo je

napredniji tip u odnosu na DATE. Čak i ako pri kreiranju baze podataka nemamo razloga za

smeštanje vrednosti ovog tipa, u toku “života” baze podataka može se javiti potreba za tim

(npr. otvaranje predstavništva kompanije širom sveta).

Budući da smo kroz primere videli da je TIMESTAMP jako “moćan” tip podataka i

naveli veliki broj funkcija kojim je podržan u Oracle PL/SQL-u, zaista ne treba zazirati od

njegove upotrebe već ga koristiti gde god je to potrebno, bez opterećivanja logike aplikacije o

vođenju računa o onim stvarima o kojima, kako smo pokazali, Oracle DBMS ume sasvim

lepo da se brine.

Page 16: Tip TIMESTAMP kod Oracle SQL-a i njegovo koriscenje

Tip TIMESTAMP kod Oracle SQL-a i njegovo korišćenje

16

Literatura

1. Steven Feuerstein with Bill Pribyl

Oracle PL/SQL Programming (3rd Ed.), Chapter 10; O'Reilly, 2002

http://oreilly.com/catalog/oraclep3/chapter/ch10.pdf

2. Michael Rosenblum and Dr. Paul Dorsey

Oracle PL/SQL for Dummies; Wiley Publishing Inc., 2006

3. http://favo.dbk2008.com/CodeExample/Code/Oracle/CatalogOracle.htm

4. http://www.techonthenet.com/oracle/functions/index.php