tip timestamp kod oracle sql-a i njegovo koriscenje
DESCRIPTION
Karakteristike Timestamp tipa podatka u Oracle DBMS-u.TRANSCRIPT
Tip TIMESTAMP kod Oracle SQL-a
i njegovo korišćenje
Saša Kostić
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
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.
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:
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
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.
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.
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:
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
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);
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';
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})
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.
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.
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.
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