Kako postaviti pametne telefone i računala. Informativni portal

Ugrađene Oracle funkcije.

Sada pogledajmo značajke rada s funkcijom TO_CHAR() u odnosu na transformaciju brojeva. Prilikom izvođenja ove operacije, funkcija ima sljedeću sintaksu:

TO_CHAR(broj, [, format[, nls_parametar]])

U ovom slučaju funkcija TO_CHAR() pretvara tip BROJ u vrsti VARCHAR2. Tablica pokazuje koji formati postoje i kako se koriste u pretvorbi:

Element oblikovanjaPrimjer niza ovog formataOpis
9 99 Svaka znamenka 9 predstavlja značajnu znamenku rezultata. Broj značajne figure povratna vrijednost jednaka je broju znamenki 9, negativno značenje ispred koje stoji znak minus. Sve vodeće nule zamijenjene su razmacima.
0 0999 Vraća broj s vodećim nulama umjesto razmacima.
0 9990 Vraća se broj s nulama na kraju umjesto razmacima.
$ $999 Povratnoj vrijednosti prethodi znak dolara, bez obzira na simbol valute koji se koristi, i može se koristiti zajedno s nulama na početku ili na kraju.
BB999Vraćaju se praznine umjesto nultog cijelog dijela decimalnog broja.
MI999MIVraća negativan broj sa znakom minus na kraju umjesto na početku. U pozitivnoj vrijednosti na ovom mjestu će biti prostor.
SS9999Vraćenom broju prethodi znak: + za pozitivne brojeve, brojevi - za negativne.
S9999SVraćeni broj završava znakom: + za pozitivne brojeve, brojevi - za negativne.
PR99PRVraća negativan broj u uglastim zagradama "<", ">". pozitivni brojevi, na ovom mjestu ima mjesta.
D99D9Vraća broj s decimalnom točkom na navedenoj poziciji. Broj 9 s obje strane označava najveći broj brojevima
G9G999Vraća broj s razdjelnikom grupe na navedenoj poziciji. G
CC99Vraća broj s ISO simbolom valute na navedenoj poziciji. C može se pojaviti u navedenom nizu formata više puta.
LL999Vraća broj sa simbolom valute nacionalnog jezika na navedenoj poziciji.
, 999,999 Vraća broj iza kojeg slijedi zarez na navedenom mjestu, bez obzira na odabrani razdjelnik grupe.
. 99.99 Vraća broj s decimalnom točkom na navedenoj poziciji, bez obzira na odabrani decimalni razdjelnik.
V99V999Vraća broj pomnožen s 10n, Gdje n je broj znamenki 9 iza V. Ako je potrebno, vrijednost se zaokružuje.
EEEE9,99EEEEVraća broj u znanstvenom zapisu.
R.M.R.M.Vraća broj korištenjem velikih rimskih brojeva.

Na primjer, ovdje je sljedeći blok:

POSTAVITE SERVEROUTPUT NA POČETAK -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(534523)); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(34387, "99999")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(5000, "$9999")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(-9, "9S")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(-34, "S99")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(3 - 5, "999MI")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(7 - 3, "S9")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(4 - 5, "99PR")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(8900, "L9999")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(10000000, "9.9EEEE")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(10, "RM")); -- Funkcija TO_CHAR() -- DBMS_OUTPUT.put_line(TO_CHAR(105, "RM")); KRAJ; /

Nakon pokretanja dobivamo:

SQL> BEGIN 2 3 -- Funkcija TO_CHAR() -- 4 DBMS_OUTPUT.put_line(TO_CHAR(534523)); 5 6 -- Funkcija TO_CHAR() -- 7 DBMS_OUTPUT.put_line(TO_CHAR(34387, "99999")); 8 9 -- Funkcija TO_CHAR() -- 10 DBMS_OUTPUT.put_line(TO_CHAR(5000, "$9999")); 11 12 -- Funkcija TO_CHAR() -- 13 DBMS_OUTPUT.put_line(TO_CHAR(-9, "9S")); 14 15 -- Funkcija TO_CHAR() -- 16 DBMS_OUTPUT.put_line(TO_CHAR(-34, "S99")); 17 18 -- Funkcija TO_CHAR() -- 19 DBMS_OUTPUT.put_line(TO_CHAR(3 - 5, "999MI")); 20 21 -- Funkcija TO_CHAR() -- 22 DBMS_OUTPUT.put_line(TO_CHAR(7 - 3, "S9")); 23 24 -- Funkcija TO_CHAR() -- 25 DBMS_OUTPUT.put_line(TO_CHAR(4 - 5, "99PR")); 26 27 -- Funkcija TO_CHAR() -- 28 DBMS_OUTPUT.put_line(TO_CHAR(8900, "L9999")); 29 30 -- Funkcija TO_CHAR() -- 31 DBMS_OUTPUT.put_line(TO_CHAR(10000000, "9.9EEEE")); 32 33 -- Funkcija TO_CHAR() -- 34 DBMS_OUTPUT.put_line(TO_CHAR(10, "RM")); 35 36 -- Funkcija TO_CHAR() -- 37 DBMS_OUTPUT.put_line(TO_CHAR(105, "RM")); 38 39 KRAJ; 40 / 534523 34387 $5000 9- -34 2- +4 RUR 8900 1.0E+07 X CV PL/SQL postupak uspješno dovršen.

A radi potpunosti, pogledajmo funkciju TO_NUMBER(), budući da sa TO_CHAR() praktički su blizanci, ali s dvije suprotne strane. Sintaksa TO_NUMBER Sljedeći:

TO_NUMBER(niz_znakova, [, format [, nls_parametar]])

U u ovom slučaju"niz_znakova" je vrsta CHAR ili VARCHAR2, koji se kada se primijeni na "format" pretvara u vrstu BROJ. "format" u ovoj funkciji je isti kao i za TO_CHAR(). To je vrlo jednostavno. I, ako u prethodnom primjeru promijenimo, na primjer, treći red odozdo ovako:

DBMS_OUTPUT.put_line(TO_CHAR(TO_NUMBER("10000000", "9,9EEEE"), "9,9EEEE"));

U prethodnom smo članku pogledali ugrađene funkcije za rad s nizovima. U ovom članku pričati ćemo o funkcijama za rad s datumom/vremenom i funkcijama za pretvorbu tipa za datume. Za pohranjivanje datuma i vremena, Oracle nudi poseban tip DATE. S fizička točka pogledajte ga razlomački broj, cijeli dio koji pohranjuje broj dana od određenog baznog datuma, a frakcijski pohranjuje vrijeme. To vam omogućuje izvođenje preko datuma aritmetičke operacije- zbrajanje i oduzimanje.

Funkcija SYSDATE

Ovo je jedna od najčešće korištenih funkcija; vraća trenutni datum i vrijeme prema satu poslužitelja.

Funkcija LAST_DAY(d)

Vraća posljednji dan u mjesecu navedenom u datumu d.

SELECT SYSDATE d,

LAST_DAY(SYSDATE) d1

Funkcija MONTHS_BETWEEN(d1, d2)

Funkcija MONTH_BETWEEN vraća broj mjeseci između dva datuma d1 i d2, uzimajući u obzir predznak kao d1-d2, a vraćeni broj je razlomak.

SELECT MONTHS_BETWEEN("2.09.2006", "2.05.2006") d1,

MONTHS_BETWEEN("12.09.2006", "2.05.2006") d2,

MONTHS_BETWEEN("2.05.2006", "12.09.2006") d3

Razmotrimo tipični primjeri- skraćivanje datuma na sate, dane, mjesec i godinu. Zadana maska ​​formata je "DD"

ODABERITE SUSTAVNI DATUM d1,

TRUNC(SYSDATE, "HH24") d2,

TRUNC(SYSDATE, "DD") d3,

TRUNC(SYSDATE, "MM") d4,

TRUNC(SYSDATE, "GGGG") d5

Maske formata dopuštene za funkcije TRUNC i ROUND

Pogledajmo pobliže maske formata i značajke njihove upotrebe.

Maska

Svrha

Prvi dan stoljeća

GODINA, ili GGGG, ili GG, ili G

Prvi dan u godini

Prvi dan kvartala

MJESEC, ili PON, ili MM

Prvi dan u mjesecu

Isti dan u tjednu kao i prvi dan tekuće godine

Isti dan u tjednu kao prvi dan tekućeg mjeseca

DAN ili DY ili D

Prvi dan u tjednu

HH, ili HH12, ili HH24

Funkcija TO_DATE(str[,mask [,nls_lang]])

Funkcija TO_DATE pretvara niz str u datum. Pretvorba se provodi pomoću maske maske, ako je navedena. Ako maska ​​nije navedena, uzima se zadana maska. Ako navedete masku, možete navesti još jedan parametar - jezik koji se koristi prilikom oblikovanja naziva mjeseci i dana. Ako postoji pogreška pri analizi niza str u skladu s navedenom maskom, javlja se pogreška: iznimna situacija. Najčešća pogreška je "ORA-01830: Predložak formata datuma završava prije pretvaranja cijelog niza unosa." Osim toga, često se susreće pogreška "ORA-01821: format datuma nije prepoznat" - pojavljuje se kada je navedena nevažeća maska ​​formata.

SELECT TO_DATE("12.09.2006") d

Maske formata dopuštene za funkcije TO_CHAR prilikom oblikovanja datuma

Stoljeća, sa znakom minus ispred datuma pr.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE-1000000, "SCC") d2

26.09.2006 17:14:21

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "GGGG") d2

Godina, napisana riječima današnjim državnim jezikom.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "YEAR") d2

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "MM") d2

Naziv mjeseca riječima.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "MONTH") d2

Tjedan u godini.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "WW") d2

Dan u godini.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "DDD") d2

Dan u tjednu ispisuje se riječima, po potrebi dopunjenim s do devet znakova s ​​razmacima.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "DAN") d2

Julijanski kalendarski datum. Je li broj dana od 01.01.4712. pr.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "J") d2

Sat u danu na 12-satnoj skali (1-12).

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "HH") d2

Zapisnik (0-59).

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "MI") d2

Ova maska ​​formata korisna je za mjerenje vremenskih intervala u sekundama.

Interpunkcijski znakovi. Oni se izlaze na odgovarajuća mjesta u formatiranom datumu.

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "DD.MM.GGGG HH24.MI") d2,

TO_CHAR(SYSDATE, "DD/MM/GGGG HH12.MI PM") d3

Elementi maske oblikovanja dizajnirani za prikaz tekstualnih informacija razlikuju velika i mala slova - velika i mala slova kontroliraju velika i mala slova formatiranog teksta. Pogledajmo upravljanje registrom koristeći masku formata DAY kao primjer:

ODABERITE SUSTAVNI DATUM d1,

TO_CHAR(SYSDATE, "DAN") d2,

TO_CHAR(SYSDATE, "Dan") d3,

TO_CHAR(SYSDATE, "dan") d4

26.09.2006 17:47:45

Lako je vidjeti da ako je maska ​​napisana velikim slovima, onda je formatirana tekstualna vrijednost vraća velikim slovima. Ako je u donjem, formatirana vrijednost će također biti u donjem. I na kraju, snimanje maske sa veliko slovo uzrokuje da se generirani tekst oblikuje tako da počinje velikim slovom.

Zaključak

U ovom smo članku pregledali sve glavne ugrađene Oracle funkcije, dizajniran za rad s datumima i izvođenje operacija konverzije tipa s tipom "datum". U sljedećem članku pogledat ćemo funkcije pretvorbe brojeva i formatiranja i prijeći na praktične upite pomoću funkcija o kojima smo ranije govorili.

Kako bi se pojednostavio rad s nizovima, postoji niz ugrađenih funkcija koje uvelike olakšavaju takve operacije kao što su pretvaranje nizova u podatke drugih vrsta, traženje podniza u nizu, određivanje duljine niza itd. U ovom članku pogledat ćemo najčešće funkcije za rad sa stringovima.

1) Funkcija za određivanje duljine niza LENGTH(string), vraća broj znakova u nizu, uključujući i razmake na kraju.

SELECT LENGTH(‘niz’) FROM DUAL vratit će vrijednost 7.

2) Funkcije pretvorbe velikih i malih slova UPPER(niz), LOWER(niz), INITCAP(niz). Za pretvaranje znakova u velika slova koristite funkciju UPPER().

SELECT UPPER('niz') FROM DUAL vratit će STRING.

Ako znakove niza trebate pretvoriti u mala slova Koristi se funkcija LOWER().

SELECT LOWER('StrinG') FROM DUAL će vratiti niz.

Funkcija INITCAP pretvara svaki prvi znak riječi u velika slova, a sve ostale znakove u mala slova, pod uvjetom da je znak razdjelnika riječi razmak.

SELECT INITCAP('string1 string2') FROM DUAL će vratiti String1 String2.

3) Funkcije za skraćivanje razmaka na početku i na kraju LTRIM(string), RTRIM(string), TRIM(string). U skladu s tim, prva funkcija skraćuje sve početne razmake retka, druga – sve zadnje razmake, a treća – sve početne i zadnje razmake.

SELECT LTRIM(‘ str1’) FROM DUAL će vratiti niz str1,
SELECT RTRIM(‘str2’) FROM DUAL će vratiti niz str2,
SELECT TRIM(‘ str3 ’) FROM DUAL će vratiti niz str3.

4) Funkcija zamjene dijela niza drugim nizom REPLACE(originalni_niz, zamijenjeni_podniz, zamjenski_podniz). Radi veće jasnoće, pogledajmo primjer gdje je broj pohranjen u određenom tekstualnom polju u tablici. Štoviše, znak razdjelnika između cijelog broja i razlomački dio u nekim poljima postoji “.”, a za daljnju obradu podataka potrebno je da u svim poljima bude “,”. Za ovo ćemo koristiti ZAMIJENI funkciju na sljedeći način. REPLACE(polje1, ’.’, ’,’) i sve “.” u polju polje će biti zamijenjeno simbolom “,”.

SELECT REPLACE('My_string','_','@') FROM DUAL će vratiti niz My@string.

5) Funkcije za pretvaranje podataka u druge vrste podataka. TO_CHAR(broj) pretvara broj u tekst. TO_NUMBER(niz) pretvara tekst u broj. TO_DATE(string, date_format) pretvara niz u određeni format datuma.

SELECT TO_CHAR(123) FROM DUAL će vratiti red 123,
SELECT TO_NUMBER('12345') FROM DUAL će vratiti broj 12345,
SELECT TO_DATE('01.01.2010','dd.mon.yyyy') FROM DUAL vratit će datum 01.JAN.2010.

6) Funkcija za utvrđivanje pojavljivanja podniza u nizu INSTR (source_string, substring, character_number). Ova vam funkcija omogućuje određivanje broja znakova u izvorna linija od kojeg počinje traženi podniz (ako postoji). U suprotnom se vraća 0. Na primjer, trebamo odrediti sve pozicije u tablici Table1 u čijem se nazivu pojavljuje podstring “manager”. Sljedeći operator je sasvim prikladan za to

SELECT * FROM TABLE1 WHERE INSTR(POST, 'manager', 1) > 0.

To je SELECT izjava prikazat će samo one zapise iz tablice TABLE1 gdje će se pronaći traženi podniz “manager”. Štoviše, pretraga će se provesti od prvog znaka. Ako se pretraga mora izvršiti s druge pozicije, tada je u trećem parametru naznačen broj znaka za početak pretrage.

SELECT INSTR('Mali niz', 'niz', 1) FROM DUAL vratit će vrijednost 7,
SELECT INSTR('Mali niz', 'Niz', 1) FROM DUAL vratit će vrijednost 0.

7) Funkcija za odabir podniza u izvornom nizu SUBSTR (izvorni_niz, početni_broj_znaka, broj_znakova). Razmotrimo ovaj primjer: korisnička tablica pohranjuje adresu u obliku naziva naselja, naziva ulice i kućnog broja. Štoviše, pouzdano znamo da je za naziv naselja predviđeno striktno 20 znakova (ako je naziv naselja manji od 20 znakova, ostatak se popunjava razmacima), za naziv ulice 30 znakova, za znakovi kućnog broja 3. Dalje, moramo prenijeti sve adrese iz naše tablice u drugu, au isto vrijeme sve 3 komponente adrese moraju biti u različitim poljima. Za odabir komponenti adrese koristite funkciju SUBSTR().

SELECT SUBSTR(TABLE_1.ADDRESS, 1, 20) GRAD, SUBSTR(TABLE_1.ADDRESS, 21, 30) ULICA, SUBSTR(TABLE_1.ADDRESS, 52, 3) GRAD IZ TABLE_1

Naravno, za prijenos podataka morate koristiti operator INSERT, ali za razumijevanje rada funkcije SUBSTR, primjer koji se raspravlja je sasvim prikladan.
SELECT SUBSTR('My_string', 4, 3) FROM DUAL će vratiti niz str.

Gore spomenute funkcije mogu se koristiti u ulaznim parametrima. Dakle, ako trebamo odabrati sve znakove nakon određenog, tada možemo proslijediti broj traženog znaka iz funkcije INSTR u funkciju SUBSTR. Na primjer, ako trebate prenijeti sve znakove iz polja tablice koji se nalaze nakon ",", tada možete koristiti ovu konstrukciju
SELECT SUBSTR(My_string, INSTR(My_string, ',', 1), LENGTH(My_string)- INSTR(My_string, ',', 1)+1) FROM DUAL.
Da bismo odredili početni znak, pozivamo funkciju INSTR(), koja će vratiti broj znaka prvog pojavljivanja podnizova ",". Zatim definiramo broj znakova do kraja niza kao razliku između duljine niza i broja prvog pojavljivanja podniza.

8) Za određivanje koda znaka koristi se funkcija ASCII(string) koja vraća kod 1 znaka niza. Na primjer

SELECT ASCII(W) FROM DUAL vratit će vrijednost 87.

9) Inverzna funkcija Pretvaranje koda znaka u znak CHR(broj).

SELECT CHR(87) FROM DUAL će vratiti znak W.

Funkcije za rad s brojevima u Oracleu.

U Oracle DBMS Postoji niz funkcija za rad s brojevima. To uključuje funkcije za dizanje broja na potenciju POWER(), zaokruživanje ROUND() itd.

1) Funkcija ABS(broj) vraća apsolutnu vrijednost argumenta.
SELECT ABS(-3) FROM DUAL će vratiti vrijednost 3.

2) Funkcija CEIL(broj) vraća najmanji cijeli broj veći ili jednak proslijeđenom parametru.
SELECT CEIL(4.5) FROM DUAL vratit će vrijednost 5.

3) Funkcija FLOOR(broj) vraća najveći cijeli broj manji ili jednak proslijeđenom parametru.
SELECT FLOOR(3.8) FROM DUAL vratit će vrijednost 3.

4) Funkcija MOD(broj_1, broj_2) vraća ostatak dijeljenja prvog parametra s drugim.
SELECT MOD(5, 3) FROM DUAL će vratiti vrijednost 2. Napomena. Ako je drugi parametar 0, tada funkcija vraća prvi parametar.

5) Funkcija zaokruživanja ROUND(broj_1, broj_2). Zaokružuje prvi proslijeđeni parametar na broj znamenki proslijeđen u drugom parametru. Ako drugi parametar nije naveden, tada se uzima jednak 0, odnosno zaokružuje se na cjelobrojnu vrijednost. Primjeri
SELECT ROUND(101.34) FROM DUAL vratit će vrijednost 101,
SELECT ROUND(100.1268, 2) FROM DUAL će vratiti vrijednost 100.13
SELECT ROUND(1234000.3254, -2) FROM DUAL će vratiti vrijednost 1234000,
SELECT ROUND(-100.122, 2) FROM DUAL će vratiti -100.12.

6) Funkcija skraćivanja vrijednosti TRUNC(broj_1, broj_2). Vraća vrijednost prvog parametra skraćenu na broj decimalnih mjesta navedenih u drugom parametru. Primjeri
SELECT TRUNC(150.58) FROM DUAL vratit će vrijednost 150
SELECT TRUNC(235.4587, 2) FROM DUAL će vratiti 235.45
SELECT TRUNC(101.23, -1) FROM DUAL vratit će vrijednost 100

7) Oracle DBMS ima brojne trigonometrijske funkcije SIN(broj), COS(broj), TAN(broj) i njihove inverze ACOS(broj), ASIN(broj), ATAN(broj). Vraćaju vrijednost trigonometrijske funkcije koja odgovara imenu. Za izravne funkcije parametar je vrijednost kuta u radijanima, a za inverzne funkcije vrijednost funkcije. Primjeri
SELECT COS(0.5) FROM DUAL će vratiti vrijednost 0.877582561890373
SELECT SIN(0.5) FROM DUAL vratit će vrijednost 0.479425538604203
SELECT TAN(0.5) FROM DUAL vratit će vrijednost 0.546302489843791
SELECT ACOS(0.5) FROM DUAL će vratiti vrijednost 1.0471975511966
SELECT ASIN(0.5) FROM DUAL će vratiti 0.523598775598299
SELECT ATAN(0.5) FROM DUAL vratit će vrijednost 0.463647609000806

8) Hiperboličke funkcije. SINH(broj),
COSH(broj), TANH(broj). SINH() vraća hiperbolički sinus proslijeđenog parametra, COSH() vraća hiperbolički kosinus proslijeđenog parametra, TANH() vraća hiperbolički tangens proslijeđenog parametra. Primjeri
SELECT COSH(0.5) FROM DUAL će vratiti vrijednost 1.12762596520638
SELECT SINH(0.5) FROM DUAL će vratiti vrijednost 0.521095305493747 SELECT TANH(0.5) FROM DUAL će vratiti vrijednost 0.46211715726001

9) Funkcija stepenovanja POWER(broj_1, broj_2). Primjeri
SELECT POWER(10, 2) FROM DUAL će vratiti vrijednost 100
SELECT POWER(100, -2) FROM DUAL vratit će vrijednost 0,0001

10) Logaritamske funkcije. LN(broj) vraća prirodni logaritam proslijeđenog parametra, LOG(broj_1, broj_2) vraća logaritam drugog parametra proslijeđenog na bazu proslijeđenu prvom parametru. Štoviše, prvi parametar mora biti veći od nule, a ne jednak 1. Primjeri
SELECT LN(5) FROM DUAL vratit će vrijednost 1,6094379124341
SELECT LOG(10, 3) FROM DUAL će vratiti vrijednost 0,477121254719662

11) Funkcija izbacivanja korijen SQRT(broj). Primjer
SELECT SQRT(4) FROM DUAL će vratiti vrijednost 2.

12) Funkcija dizanja broja e na potenciju EXP(broj). Primjer
SELECT EXP(2) FROM DUAL vratit će vrijednost 7,38905609893065.

Oracle funkcije datuma

U praksi je vrlo često potrebno analizirati podatke u obliku datuma, izvršiti neke operacije nad njima i promijeniti format. Sve te operacije već su implementirane kao ugrađene funkcije. Pogledajmo najosnovnije od njih.

1) ADD_MONTHS(datum, broj_mjeseci) vraća datum odvojen od datuma proslijeđenog u prvom parametru brojem mjeseci navedenih u drugom parametru. Primjeri
SELECT ADD_MONTHS('01-JAN-2010', 2) FROM DUAL će vratiti datum '03/01/2010'
SELECT ADD_MONTHS('01-JAN-2010', -3) FROM DUAL vratit će datum '01.10.2009'
SELECT ADD_MONTHS('30-JAN-2010', 1) FROM DUAL će vratiti datum '02/28/2010'

2) Odrediti trenutni datum i vrijeme primjene funkcije SYSDATE. Opseg primjene ove funkcije mnogo je širi nego što se na prvi pogled čini. Prije svega, to je kontrola unosa podataka u bazu podataka. Mnoge tablice imaju zasebno polje za pohranjivanje datuma posljednje izmjene. Također je vrlo zgodno kontrolirati određene ulazne parametre za izvješća, posebno ako ne bi trebali biti veći od trenutnog datuma. Osim datuma, ova funkcija također vraća vrijeme točno na sekunde. Primjer
SELECT SYSDATE FROM DUAL vratit će datum '05/22/2010 14:51:20'

3) Ako trebate odrediti posljednji dan u mjesecu, tada je funkcija LAST_DAY(datum) sasvim prikladna za to. Može se koristiti za određivanje broja preostalih dana u mjesecu.
SELECT LAST_DAY(SYSDATE) – SYSDATE FROM DUAL.
Kao rezultat izvršenja ove izjave, prikazat će se broj dana od trenutnog datuma do kraja mjeseca. Primjer
SELECT LAST_DAY('15-FEB-2010') FROM DUAL vratit će datum '02/28/2010'.

4) Funkcija za određivanje broja mjeseci između datuma MONTHS_BETWEEN(datum_1, datum_2). Primjeri
SELECT MONTHS_BETWEEN('01-JUL-2009', '01-JAN-2010') FROM DUAL će vratiti -6
SELECT MONTHS_BETWEEN('01-JUL-2009', '10-JAN-2010') FROM DUAL vratit će -6,29032258064516.
Bilješka. Ako su dani u mjesecima isti, tada funkcija vraća cijeli broj, inače će rezultat biti razlomak, a broj dana u mjesecu bit će 31.

5) Funkcija NEXT_DAY(datum, day_of_week) omogućuje određivanje sljedećeg datuma prema datumu prenesenom u prvom parametru, koji odgovara danu u tjednu prenesenom u drugom parametru. Primjer
SELECT NEXT_DAY('01-JUL-2009', 'pon') FROM DUAL će vratiti datum '07/06/2009', to jest, sljedeći ponedjeljak nakon što se 1. srpnja 2009. dogodio 6. srpnja.

6) Zaokruživanje datuma ROUND(datum, format). Drugi parametar nije obavezan; ako nije naveden, uzima se kao 'DD', odnosno zaokruživanje će se izvršiti na najbliži dan. Primjeri
SELECT ROUND(SYSDATE) FROM DUAL će vratiti datum '05/23/2010'
SELECT ROUND(SYSDATE, MONTH) FROM DUAL vratit će datum '06/01/2010', zaokružen na najbliži prvi dan u mjesecu.

7) Skraćivanje datuma. TRUNC(datum, format) funkcija. Baš kao i onaj gore spomenut, možda nema drugi parametar. U tom slučaju, skraćivanje će se provesti do sljedećeg dana. Primjeri
SELECT TRUNC(SYSDATE) FROM DUAL će vratiti datum '05/22/2010'
SELECT TRUNC(SYSDATE, 'WW') FROM DUAL će vratiti datum '05/01/2010'
SELECT TRUNC(SYSDATE, 'Dan') FROM DUAL će vratiti datum '05/16/2010'.

Funkcije pretvorbe podataka u Oracleu

Ovaj odjeljak posvećen je razmatranju pretvorbe podataka u raznih formata. U praksi su česte situacije kada je potrebno tretirati vrijednosti niza kao brojeve i obrnuto. Unatoč malom broju funkcija, njihove mogućnosti su sasvim dovoljne za rješavanje vrlo složenih aplikativnih problema.

1) TO_CHAR(podaci, format). Na prvi pogled, sintaksa je prilično jednostavna, ali zahvaljujući drugom parametru možete vrlo precizno opisati u koji format treba pretvoriti podatke. Dakle, možete pretvoriti i datum i numeričku vrijednost u niz. Razmotrite opciju pretvaranja datuma u niz. Vrijednosti najčešćih formata dane su u tablici, više pune informacije sadržane u tehničkoj dokumentaciji.

Tablica vrijednosti formata za pretvaranje broja u niz.

SELECT TO_CHAR(SYSDATE, 'D-MONTH-YY') FROM DUAL vratit će niz '7-MAY -10'
SELECT TO_CHAR(SYSDATE, 'DDD-MM-YYYY') FROM DUAL vratit će niz '142-05-2010'
SELECT TO_CHAR(SYSDATE, 'Q-D-MM-YYY') FROM DUAL vratit će niz '2-7-05-010'
SELECT TO_CHAR(1050, '9.99EEEE) FROM DUAL vratit će niz '1.050E+03'
SELECT TO_CHAR(1400, '9999V999') FROM DUAL vratit će niz '1400000'
SELECT TO_CHAR(48, 'RM') FROM DUAL vratit će niz 'XLVIII'

2) Funkcija za pretvaranje niza u datum TO_DATE(string, format). Moguće vrijednosti formata već su raspravljene gore, pa ću dati nekoliko primjera korištenja ove funkcije. Primjeri
SELECT TO_DATE('01/01/2010', 'DD.MM.YYYY') FROM DUAL vratit će datum '01/01/2010'
SELECT TO_DATE('01.JAN.2010', 'DD.MON.YYYY') FROM DUAL vratit će datum '01.01.2009'
SELECT TO_DATE('15-01-10', 'DD-MM-YY') FROM DUAL će vratiti datum '01/15/2010'.

3) Funkcija za pretvaranje niza u numeričku vrijednost TO_NUMBER(string, format). Najčešće vrijednosti formata navedene su u tablici, pa pogledajmo korištenje ove funkcije pomoću primjera. Primjeri
SELECT TO_NUMBER('100') FROM DUAL vratit će broj 100
SELECT TO_NUMBER('0010.01', '9999D99') FROM DUAL vratit će broj 10.01
SELECT TO_NUMBER("500,000","999G999") FROM DUAL vratit će broj 500000.

S. Moiseenko

S točnošću od dvije decimalne znamenke odredite prosječnu količinu oružja za klase bojnih brodova.

Pretpostavljam da u ovom zadatku postoji samo jedan problem, a to je zaokruživanje. Ali nedavno sam dobio sljedeće rješenje:

SELECT SUM(sum_g)/SUM(count_g) FROM
(SELECT SUM(numGuns) AS sum_g , COUNT(*) AS count_g
FROM Classes INNER JOIN Brodovi ON Classes.class = Brodovi.class
WHERE type="bb"
UNIJA
SELECT SUM(numGuns) AS sum_g , COUNT(*) AS count_g
FROM Classes INNER JOIN Ishodi ON Classes.class = Outcomes.ship
WHERE type="bb") AS a

Vrlo je bogat za analizu grešaka J. Krenimo od zaokruživanja. Broj topova je cijeli broj (prema vrsti stupca, ne prema logici!). Zato će sam zbroj biti cijeli broj. Kada dijelimo cijele brojeve u SQL Serveru uvijek dobivamo cijeli broj. A rezultat se ne postiže zaokruživanjem, već ODBACIVANJEM razlomka. Na primjer, izvršite sljedeći upit:

Rezultat će biti 0, a to potvrđuje ono što smo rekli. Dakle, da bismo napravili kozmetička poboljšanja ovog upita, barem jedan operand treba pretvoriti u pravi tip. Kao što sam napisao u pomoći na www.sql-ex .ru, možete koristiti implicitnu konverziju tipa:

SELECT SUM(sum_g)*1.0/SUM(count_g)

to jest, kad se množi realnom jedinicom, brojnik sam postaje realan broj.

Sada, kako trebamo računati prosjek po klasama, prvo ne bismo trebali uzimati u obzir brodove, a drugo, ne moramo pamtiti brodove iz tablice Ishodi.

Ali za analizu pogrešaka razmotrimo rješenje u autorovoj interpretaciji, to jest, definirat ćemo prosječnu vrijednost za sve linearne brodove iz baze podataka, a to ispada zadatak 54. Raspravljao sam o tome zadatak, ali s još jednom greškom.

Dakle, broj oružja i količina se računaju odvojeno po brodovima iz tablice Brodovi i po glavnim brodovima iz tablice Ishodi. Zatim, u glavnom upitu sažimamo broj oružja i iznos od po brodovima svake tablice i podijelite prvu s drugom da biste dobili prosječnu vrijednost.

Razmotrimo primjer. Neka u tablici Brodovi budu 2 broda s 11 i 8 topova, au tablici Ishodi 1 brod s 11 topova. Dakle, dobivamo 3 broda s 30 topova. Prosječna vrijednost je 30/3= 10. Je li to točno? Ne, odnosno točno je samo za određene slučajeve, dok za bilo koji podatak trebamo napisati upit koji će biti točan. Vidim nekoliko primjera koji to dokazuju.

Prvi. Što ako ne postoji glavni brod koji odgovara uvjetima zadatka u tablici ishoda? Tada će drugi upit vratiti: 0 brodova, broj topova je NULL. Kao rezultat izračunavanja prosjeka ćemo dobiti

(19 + NULL)/(2+0) = NULL

Drugi. Neka glavni brod klase 'bb" bude i u tablici Brodovi i u tablici Ishodi, to znači da je to isti brod. Tada bismo trebali dobiti 19/2, ali ne 30/3 kao što rješenje predstavlja.

Treći. Ali što ako je u prethodnoj situaciji na brodovima glavni brod sudjelovao u bitkama dva puta? Tada ćemo dobiti (19 + 22) / (2 + 2) umjesto naših 19/2.

Četvrta… Razmislite o tome sami. Tako se formira provjerna baza na stranici J .

» Ovdje navedeni primjeri mogu se izvršiti izravno na web stranici odabirom potvrdnog okvira "Bez provjere" na stranica uz SELECT vježbe.

Najbolji članci na temu