Sunteți pe pagina 1din 14

# CFBC

SGBD
Grigore Vasilache
TEMA NR. 14. OPERAII I FUNCII N MYSQL ....................................................................................... 1
14.1.

14.2.

14.3.

14.4.

14.5.

14.6.

14.7.

## TEMA NR. 14. OPERAII I FUNCII N MYSQL

14.1. Operaii Aritmetice.
mysql>SELECT 3+5;
-> 8
mysql>SELECT 3-5;
-> -2
mysql>SELECT 3*5;
-> 15
mysql>SELECT 1+2*3;
-> 7
mysql>SELECT (1+2)*3;
-> 9
mysql>SELECT 3/5;
-> 0.60
mysql>SELECT 102/(1-1);
->NULL
mysql>SELECT 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql>SELECT 18014398509481984*18014398509481984;
->0, Fiindc se depete limita de 64 bii.

## 14.2. Funcii logice i de comparare

Operatorii de comparare dau n rezultat 1 (TRUE), 0 (FALSE) sau NULL.
Dac un argument sau ambele sunt - NULL, i rezultatul este NULL. (excepie <=>).
Dac ambele argumente sunt iruri se compar ca irurile.
Dac ambele argumente sunt numere ntregi - se compar ca numerele ntregi.
Valori hexazecimale dac nu se compar cu numr se trateaz ca ir cu date binare.
Prin convenie nu se ine cont de registru
mysql>SELECT 1 > '6x';
-> 0
mysql>SELECT 7 > '6x';
-> 1
Pagina1din14

CFBC

SGBD

Grigore Vasilache

## mysql>SELECT 0 > 'x6';

-> 0
mysql>SELECT 0 = 'x6';
-> 1
mysql>SELECT 1 = 0;
-> 0
mysql>SELECT '0' = 0;
-> 1
mysql>SELECT '0.0' = 0;
-> 1
mysql>SELECT '0.01' = 0;
-> 0
mysql>SELECT '.01' = 0.01;
-> 1
mysql>SELECT '.01' <> '0.01';
-> 1
mysql>SELECT .01 <> '0.01';
-> 0
mysql>SELECT 'zapp' <> 'zappp'; -> 1
mysql>SELECT 0.1 <= 2;
-> 1
mysql>SELECT 2 < 2;
-> 0
mysql>SELECT 2 >= 2;
-> 1
mysql>SELECT 2 > 2;
-> 0
mysql>SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
mysql>SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0 0 1
mysql>SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;-> 1 1 0
mysql>SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql>SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql>SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql>SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
mysql>SELECT 2 n (0,3,5,'wefwf');
-> 0
mysql>SELECT 'wefwf' n (0,3,5,'wefwf');
-> 1
mysql>SELECT ISNULL(1+1);
->0
mysql>SELECT ISNULL(1/0);
->1
mysql>SELECT "a" ="A \n"; -> 1
mysql>SELECT NOT 10;
-> 0
mysql>SELECT NOT 0;
-> 1
mysql>SELECT NOT NULL;
-> NULL
mysql>SELECT ! (1+1);
-> 0
mysql>SELECT ! 1+1;
-> 1
mysql>SELECT 1 && 1;
-> 1
mysql>SELECT 1 && 0;
-> 0
mysql>SELECT 1 && NULL; -> NULL
mysql>SELECT 0 && NULL; -> 0
mysql>SELECT NULL && 0; -> 0
mysql>SELECT 1 || 1;
-> 1
mysql>SELECT 1 || 0;
-> 1
mysql>SELECT 0 || 0;
-> 0
mysql>SELECT 0 || NULL;
-> NULL
mysql>SELECT 1 || NULL;
-> 1
mysql>SELECT 1 XOR 1;
-> 0
mysql>SELECT 1 XOR 0;
-> 1
Pagina2din14

CFBC

SGBD

Grigore Vasilache

## mysql>SELECT 1 XOR NULL;

-> NULL
mysql>SELECT 1 XOR 1 XOR 1;
-> 1
a XOR b este echivalent (a AND (NOT b)) OR ((NOT a) and b).

## 14.3. Funcii matematice frecvent utilizate n MySQL

Not: ntre numele funciei i paranteze nu trebuie s fie lacune. Activarea mysqld cu
parametrul --ansi sau CLIENT_IGNORE_SPACE n mysql_connect(), ne permite s
avem spaii ntre numele funciei i paranteze.
mysql>SELECT MOD(29,9);
-> 2
Nr.
1.

funcie
abs(x)

sign(x)

## Valoarea -1, 0 sau 1, dup cum

valoarea lui x este negativa, zero
sau pozitiva

log(b, x)

baza este 2

2.

3.
4.

Descriere

5.
log10(x)
6.
7.
8.
9.

log2(x)
exp(x)
ceiling(x)
floor(x)

## Baza logaritmilor naturali (e)

ridicata la puterea x
Cel mai mic ntreg care nu este mai
mic dect x
Cel mai mare ntreg care nu este
mai mare dect x

10.

11.
12.

13.
14.

mod(n,m), %

Restul mpririi

mod(x,y)

## Restul mpririi x/y

greatest(x,y,...)

pow(x,y),
power(x,y)

x la puterea y

str

## mysql>SELECT GREATEST(2,0); -> 2

mysql>SELECT
GREATEST(34.0,3.0,5.0,767.0);
->
767.0
mysql>SELECT GREATEST("B","A","C");
-> "C"
mysql>SELECT POW(2,2); -> 4.000000
mysql>SELECT POW(2,-2); -> 0.250000

## Convertete valoarea numeric

n ir de caractere

15.
least(x,y,...)

Exemple
mysql>SELECT ABS(2); -> 2
mysql>SELECT ABS(-32); -> 32
mysql> SELECT SIGN(-32); -> -1
mysql> SELECT SIGN(0); -> 0
mysql> SELECT SIGN(234); -> 1
mysql>SELECT LN(2); -> 0.693147
mysql>SELECT LN(-2); -> NULL
mysql>SELECT LOG(2);->0.693147
mysql>SELECT LOG(2,65536); -> 16.000000
mysql>SELECT LOG10(2); -> 0.301030
mysql>SELECT LOG10(100); -> 2.000000
mysql>SELECT LOG10(-100); -> NULL
mysql>SELECT LOG2(65536); -> 16.000000
mysql>SELECT LOG2(-100); -> NULL
mysql>SELECT EXP(2); -> 7.389056
mysql>SELECT EXP(-2); -> 0.135335
mysql>SELECT CEILING(1.23); -> 2
mysql>SELECT CEILING(-1.23); -> -1
mysql>SELECT FLOOR(1.23); -> 1
mysql>SELECT FLOOR(-1.23); ->-2
mysql>SELECT MOD(234, 10); -> 4
mysql>SELECT 253 % 7; -> 1
mysql>SELECT MOD(29,9); -> 2

Pagina3din14

## mysql>SELECT LEAST(2,0); -> 0

mysql>SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql>SELECT LEAST("B","A","C"); -> "A"

CFBC

SGBD
16.
17.

sqrt(x)

square

18.
rand(x)

## Rdcina ptrat a lui x

Valoare aleatoare cu virgula, mai
mare sau egala cu zero i mai mica
dect unu

round(x)
round(x,d)

21.
truncate(x,d)

22.
23.
24.

25.
26.

## Calculeaz ptratul numrului

19.

20.

Grigore Vasilache

Trunchiaz un numr la un
anumit numr de zecimale

## sin(x), cos(x), Sinusul, cosinusul i tangenta lui x,

tan(x)
unde x este dat n radiani
acos(x), asin(x),
atan(y,x), cot(x)
Arctangenta lui x, unde x este dat n
radiani. Arctangenta lui y/x, unde
atan(x),
semnele ambelor argumente sunt
atan2(y,x)
folosite pentru a determina cadranul
cercului trigonometric
Afieaz argumentul X, transformat
degrees(x)
din radiani n grade
Afieaz argumentul X, transformat
radians(x)
din grade n radiani

27.
pi()

## mysql>SELECT ROUND(-1.23); -> -1

mysql>SELECT ROUND(-1.58); -> -2
mysql>SELECT ROUND(1.58); -> 2
mysql>SELECT ROUND(1.298, 1); -> 1.3
mysql>SELECT ROUND(1.298, 0); -> 1
mysql>SELECT TRUNCATE(1.223,1); -> 1.2
mysql>SELECT TRUNCATE(1.999,1); -> 1.9
mysql>SELECT TRUNCATE(1.999,0); -> 1
mysql>SELECT TRUNCATE(-1.999,1); -> 1.9
mysql>SELECT TRUNCATE(122,-2); -> 100

mysql>SELECT DEGREES(PI());
-> 180.000000
mysql>SELECT RADIANS(90);
-> 1.570796
mysql>SELECT PI(); -> 3.141593
mysql>SELECT PI()+0.000000000000000000;
-> 3.141592653589793116

Funcie

Nr.
1

2
1

Descriere

ascii(s)

## Codul ASCII al octetului celui mai din

stnga al irului s

bin(n)
bit_length(str)

## Este echivalent cu CONV(N,10,2).

Lungimea irului n bii.

char(n)

concat(s1, s2)

## Concatenarea irurilor s1 i s2; cu alte

cuvinte, s2 ataat la s1

concat_ws
(separator, str1, str2,...)

Concatenarea cu separator

Pagina4din14

Exemple
mysql>SELECT ASCII('2'); -> 50
mysql>SELECT ASCII(2); -> 50
mysql>SELECT ASCII('dx'); -> 100
mysql>SELECT ORD('2'); -> 50
mysql>SELECT BIN(12); -> '1100'
mysql>SELECT BIT_LENGTH('text'); -> 32
mysql>SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql>SELECT CHAR(65,66); -> 'AB'
mysql>SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql>SELECT CONCAT('My', NULL, 'QL'); >NULL
mysql>SELECT CONCAT(14.3); -> '14.3'
mysql>SELECT CONCAT_WS(",","First
name","Second name","Last Name");
-> 'First name,Second name,Last Name'
mysql>SELECT CONCAT_WS(",","First

CFBC

SGBD

conv
(n,from_base,to_base)

elt(n,str1,str2,str3,...)

## Transform numerele dintr-o baz n

alta. Dac to_base este negative
rezult c N este numr cu semn, altfel
N este fr semn.
Returneaz str1, dac N = 1, str2, dac
N = 2, Dac N este mai mic ca 1 sau
mai mare ca numrul de argumente se
returneaz NULL.

field(str,str1,str2,str3,...)

find_in_set(str,strlist)

hex(n)

## este echivalent cu CONV(N,10,16).

irul str, va avea n locul subirului ce
insert (str,pos,len,newstr) ncepe cu poziia pos, de lungime len
subirul newstr:
Analog cu LOCATE, cu parametrii
instr(str,substr)
schimbai.
irul s, unde toate majusculele au fost
lcase(s), lower(str)
transformate n minuscule
Primii n octei ai irului s, de la stnga
left(s,n)
la dreapta
length(s),
octet_length(str),
Numrul octeilor din irul s
char_length(str),
character_length(str)
Poziia primei apariii a lui s1 n s2,
locate(s1,
s2),
respectiv zero dac s1 nu se gsete n
position(substr n str)
s2
Obinem poziia primei ntlniri al
substr n irul str ncepnd cu poziia
locate(substr,str,pos)
pos. Dac substr n str nu este obinem
0:
Obinem irul str, la care se adaug din
partea stng simbolul (simbolurile)
lpad(str,len,padstr)
padstr, pn str va avea lungimea len.
Dac str este mai mare ca len, atunci se
micoreaz pn la len caractere.
ltrim(s)
Returneaz str fr spaiile din stnga
oct(n)
este echivalent cu CONV(N,10,8).
repeat(str,count),
Se repet str, de count ori
replicate
replace
(str,from_str,to_str)

## n str, toate apariiile from_str se

schimb cu to_str:

reverse(str)

## Inverseaz (rstoarn) irul

Primii n octei din irul s, de la dreapta
la stnga

right(s,n)
right(str,len)
rpad(s1,n,s2)

## irul s1, completat la dreapta cu irul

Pagina5din14

Grigore Vasilache
name",NULL,"Last Name");
-> 'First name,Last Name'
mysql>SELECT CONV("a",16,2); ->'1010'.
mysql>SELECT CONV("6E",18,8); -> '172'
mysql>SELECT CONV(-17,10,-18); -> '-H'
mysql>SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql>SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
mysql>SELECT FIELD('ej', 'Hej', 'ej', 'Heja',
'hej', 'foo');
-> 2
mysql>SELECT FIELD('fo', 'Hej', 'ej', 'Heja',
'hej', 'foo');
-> 0
mysql>SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
mysql>SELECT HEX(255); -> 'FF'
mysql>SELECT INSERT('Quadratic', 3, 4,
'What'); -> 'QuWhattic'
mysql>SELECT INSTR('foobarbar', 'bar'); -> 4
mysql>SELECT INSTR('xbar', 'foobar'); -> 0
mysql>SELECT LCASE
('QUADRATICALLY');-> 'quadratically'
mysql>SELECT LEFT('foobarbar', 5);
-> 'fooba'
mysql>SELECT LENGTH('text'); -> 4
mysql>SELECT OCTET_LENGTH('text'); -> 4

## mysql>SELECT LOCATE('bar', 'foobarbar'); ->

4
mysql>SELECT LOCATE('xbar', 'foobar'); -> 0
mysql>SELECT LOCATE('bar', 'foobarbar',5); >7

## mysql>SELECT LTRIM(' barbar'); -> 'barbar'

mysql>SELECT OCT(12); -> '14'
mysql>SELECT REPEAT('MySQL', 3); ->
'MySQLMySQLMySQL'
mysql>SELECT REPLACE('www.mysql.com',
'w', 'Ww');
-> 'WwWwWw.mysql.com'
mysql>SELECT REVERSE('abc'); -> 'cba'

## mysql>SELECT RIGHT('foobarbar', 4);

-> 'rbar'
mysql>SELECT RPAD('hi',5,'?'); -> 'hi???'

CFBC

SGBD

Grigore Vasilache

rtrim(s)

space(n)

## Returneaz un ir din N spaii

substring(str,pos,len),
substring(str from pos
- Sub-sir al lui s, care ncepe de la
for len),
poziia m i care are lungimea n
mid(str,pos,len)

substring_index
(str,delim,count)

## Returneaz subirul din irul str pn

la count apariii al delimitatorului
delim. Dac count >0 se afieaz tot
din stnga. Dac count <0 se afieaz
din dreapta

trim([[both | leading
| trailing]
[remstr] from] str)

## Returneaz str fr prefixele indicate

n remstr. Dac nu se indic nimic din
BOTH, LEADING sau TRAILING, se
subnelege BOTH. Dac remstr nu
este indicat se lichideaz spaiile

## - Sub-sir al lui s, cu spatiile initiale i

finale eliminate
- irul s, cu toate minusculele
ucase(s), upper(str)
convertite n majuscule
charindex
determin numrul de ordine a
caracterului, cu care se ncepe subirul
din ir
difference
returneaz coincidena irurilor
stuff
terge numrul indicat d caractere,
nlocuind cu un nou subir
unicode
Returneaz Unicode-ul caracterului din
stnga
nchar
Returneaz codul Unicode
patindex
Efectueaz cutarea subirului n ir
conform ablonului
quotename
Convertete irul n format Unicode
like
Caut un 'pattern' intr-o expresie
like pat [escape escape- folosind caracterele masc:% (orice
char
numr de caractere) i _ (un singur
caracter).
regexp pat
Face o cutare folosind o expresie string
i o expresie regulara. Returneaz 1 (a
gsit) sau 0(n-a gsit)
strcmp(expr1,expr2)
Returneaz 0 dac irurile sunt egale, -1
dac primul sir e mai mic i 1 dac irul
2 e mai mic ca irul 1
load_file
coninutul unui fiier ca sir

## mysql>SELECT RTRIM('barbar ');

-> 'barbar'
mysql>SELECT
SUBSTRING('Quadratically',5,6); -> 'ratica'
SUBSTRING(str,pos), SUBSTRING(str FROM
pos)
mysql>SELECT
SUBSTRING('Quadratically',5); -> 'ratically'
mysql>SELECT SUBSTRING('foobarbar'
FROM 4); -> 'barbar'
mysql>SELECT
SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql>SELECT
SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
mysql>SELECT TRIM(' bar '); -> 'bar'
mysql>SELECT TRIM(LEADING 'x' FROM
'xxxbarxxx'); -> 'barxxx'
mysql>SELECT TRIM(BOTH 'x' FROM
'xxxbarxxx'); -> 'bar'
mysql>SELECT TRIM(TRAILING 'xyz' FROM
'barxxyz'); -> 'barx'

trim(s)

Pagina6din14

1

## mysql> select name from guestbook where name

regexp ^j.*g;

CFBC

SGBD
Funcie

Nr.

curdate(), current_date

curtime(), current_time
dayname(date)

Descriere
Returneaz data curent n formatul
YYYY-MM-DD sau YYYYMMDD, n
dependen de contextul folosirii
funciei ir de caractere sau numeric
Returneaz ora curent n formatul
HH:MM:SS sau HHMMS

## Returneaz numrul zilei din lun

numrul de ordine a zilei lunii pentru
argumentul date de la 1 la 31
Ziua din sptmna a datei specificate
dayofweek(d)
(1 =duminica, 2=luni,, 7=smbta)
Returneaz numrul de ordine a zile din
dayofyear(d)
an pentru argumentul date n
diapazonul de la 1 la 366
Returneaz o mrime de tip DATE
pentru numrul data zilei N Funcia nu
from_days(n)
ine cont de zilele pierdute la
schimbarea calendarului
Partea orelor din momentul de timp
hour(t)
menionat (0-23)
Partea minutelor din momentul de timp
minute(t)
menionat (0-59)
Returneaz numrul de ordine a lunii n
month(d)
an pentru argumentul date n
diapazonul de la 1 la 12
Returneaz denumirea lunii pentru
monthname(date)
argumentul date
Returneaz data i ora curent n
formatul YYYY-MM-DD HH:MM:SS
now(),
sysdate(),
sau
YYYYMMDDHHMMSS
n
current_timestamp
dependen de contextul folosirii
funciei ir de caractere sau numeric
Adun N luni la perioada P (n formatul
period_add(p,n)
YYMM sau YYYYMM). Returneaz
mrimea n formatul YYYYMM
Returneaz numrul de luni ntre
period_diff (p1,p2)
perioadele P1 i P2. P1 i P2 trebuie s
fie n formatul YYMM sau YYYYMM
Returneaz numrul semestrului pentru
quarter(date)
argumentul date n diapazonul de la 1 la
4

second(t)

time_to_sec(time)

to_days(date)

Exemple
mysql>SELECT CURDATE(); -> '1997-12-15'
mysql>SELECT CURDATE() + 0; -> 19971215

## mysql>SELECT CURTIME(); -> '23:50:26'

mysql>SELECT CURTIME() + 0; -> 235026
mysql>SELECT DAYNAME("1998-02-05");
Returneaz denumirea zilei sptmnii
'Thursday'
pentru argumentul date:

dayofmonth(d)

sec_to_time(seconds)

Grigore Vasilache

## mysql>SELECT DAYOFMONTH('1998-02-03'); ->

3
mysql>SELECT DAYOFWEEK('2009-02-17'); -> 3
mysql>SELECT DAYOFYEAR('1998-02-03'); ->
34
mysql>SELECT FROM_DAYS(729669); -> '199710-07'

## mysql>SELECT HOUR('10:05:03'); -> 10

mysql>SELECT MINUTE('98-02-03 10:05:03'); ->
5
mysql>SELECT MONTH('1998-02-03'); -> 2

## mysql>SELECT MONTHNAME("1998-02-05"); ->

'February'
mysql>SELECT NOW(); -> '1997-12-15 23:50:26'
mysql>SELECT NOW() + 0; -> 19971215235026

## mysql>SELECT PERIOD_DIFF(9802,199703); ->

11
mysql>SELECT QUARTER('98-04-01'); -> 2

mysql>SELECT
SEC_TO_TIME(2378);
Returneaz
argumentul
seconds,
'00:39:38'
transformat n ore, minute i secunde n
mysql>SELECT SEC_TO_TIME(2378) + 0;
formatul HH:MM:SS sau HHMMSS
3938
Partea secundelor din momentul de mysql>SELECT SECOND('10:05:03'); -> 3
timp menionat (0-59)
mysql>SELECT TIME_TO_SEC('22:23:00');
Returneaz time, transformat n 80580
secunde
mysql> SELECT TIME_TO_SEC('00:39:38');
2378
Returneaz numrul zilei pentru data, mysql>SELECT TO_DAYS(950501); -> 728779
indicat n date, (Numrul de zile mysql>SELECT
TO_DAYS('1997-10-07');

Pagina7din14

->

->
->

->
->

->

CFBC

SGBD

weekday(date)
year(d)

datediff
datename
datepart
day
getdate
isdate

729669

mysql>SELECT
22:23:00'); -> 1

WEEKDAY('2009-02-17

yearweek

WEEK(date),
WEEK(date,first)

Valoarea
0
1
2
3

## trecute din anul 0) Funcia TO_DAYS()

nu ine cont de zilele pierdute la
schimbarea calendarului Grigorian
(1582)
Returneaz indexul zilei sptmnii
pentru argumentul date ( 0 =luni, 6 =
duminic)
Partea anilor din momentul de timp
menionat (1000-9999)
Returneaz diferena dintre dou date
indicate
Extrage din dat partea indicat i
returneaz rezultatul n format caracter
Extrage din dat partea indicat i
returneaz rezultatul n format numr
Returneaz numrul din data indicat

Grigore Vasilache

## Se verific corectitudinea unui careva

format de dat
anul i sptmna n format
YYYYWW
Dac este un argument returneaz numrul de ordine a sptmnii n an pentru date n
diapazonul de la 0 la 53 (n rile, unde duminic este prima zi a sptmnii e posibil a 53
sptmn). Forma WEEK() cu 2 argumente ne permite s indicm cu care zi se ncepe
sptmna duminic sau luni. Rezultatul 0-53 sau 1-52.
Valorile i semnificaia argumentului first:

Semnificaia
Sptmna se ncepe duminic.0-53
Sptmna se ncepe luni 0-53
Sptmna se ncepe duminic. 1-53
Sptmna se ncepe luni 1-53

mysql>SELECT WEEK('1998-02-20');
mysql>SELECT WEEK('1998-02-20',0);
mysql>SELECT WEEK('1998-02-20',1);
mysql>SELECT WEEK('1998-12-31',1);

-> 7
-> 7
-> 8
-> 53

## Urmtoarea interogare selecteaz toate n registrrile cu valoarea date_col n timpul

ultimelor 30 de zile:
mysql>SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) TO_DAYS(date_col) <= 30;
DATE_ADD(date,INTERVAL expr type),
DATE_SUB(date,INTERVAL expr type),
ADDDATE(date,INTERVAL expr type),
Pagina8din14

CFBC

SGBD

Grigore Vasilache

## SUBDATE(date,INTERVAL expr type)

Aceste funcii efectueaz operaii aritmetice asupra datelor calendaristice. Funciile
ADDDATE() i SUBDATE() sunt sinonime pentru DATE_ADD() i DATE_SUB(). n
versiunea MySQL 3.23 n loc de DATE_ADD() i DATE_SUB() putem folosi + i -, dac
expresia din dreapta este un cmp de tipul DATE sau DATETIME. Argumentul date o
mrime de tipul DATETIME sau DATE, i indic data de start. Expresia expr indic
intervalul, care trebuie adunat la data de start sau de sczut din data de start. Expresia expr
este un rnd, care poate s se nceap cu pentru intervale negative. type indic cum trebuie
interpretat aceast expresie. Funcia intermediar EXTRACT (type FROM date) Returneaz
intervalul zipului indicat (type) din valoarea data. n tabel se indic legtura dintre type i
expr:
Valoarea Type
SECOND
MINUTE
HOUR
DAY
MONTH
YEAR
MINUTE_SECOND
HOUR_MINUTE
DAY_HOUR
YEAR_MONTH
HOUR_SECOND
DAY_MINUTE
DAY_SECOND

## Formatul ateptat expr

SECONDS
MINUTES
HOURS
DAYS
MONTHS
YEARS
"MINUTES:SECONDS"
"HOURS:MINUTES"
"DAYS HOURS"
"YEARS-MONTHS"
"HOURS:MINUTES:SECONDS"
"DAYS HOURS:MINUTES"
"DAYS HOURS:MINUTES:SECONDS"

n MySQL formatul expresiei expr permite orice simbol delimitator. Dac argumentul
date este mrime de tipul DATE i operaiile posibile includ numai pri YEAR, MONTH, i
DAY (adic nu au TIME), atunci rezultatul va fi de tipul DATE. n alte cazuri - DATETIME:
mysql>SELECT "1997-12-31 23:59:59"+INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql>SELECT INTERVAL 1 DAY + "1997-12-31"; -> 1998-01-01
mysql>SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql>SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql>SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql>SELECT
DATE_ADD("1997-12-31
23:59:59",INTERVAL
"1:1"
MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql>SELECT
DATE_SUB("1998-01-01
00:00:00",INTERVAL
"1
1:1:1"
DAY_SECOND);
-> 1997-12-30 22:58:59
Pagina9din14

CFBC

SGBD

Grigore Vasilache

mysql>SELECT
DATE_ADD("1998-01-01
00:00:00",INTERVAL
"-1
10"
DAY_HOUR);
-> 1997-12-30 14:00:00
mysql>SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); -> 1997-12-02
Dac intervalul indicat este prea mic - (nu include toate prile intervalului type),
MySQL presupune c lipsesc prile de interval din stnga. De exemplu, dac e indicat type
n form DAY_SECOND, atunci expresia cerut expr trebuie s conin: zile, ore, minute i
secunde. Dac indicm valoare din intervalul "1:10", MySQL presupune c lipsesc zilele i
orele, i valoarea primit indic numai minute i secunde. Combinaia "1:10"
DAY_SECOND se interpreteaz ca echivalent cu "1:10" MINUTE_SECOND. Dac la
operaiile de + i cu participarea DATE i expresii, ce conin partea de timp rezultatul l
obinem n tipul DATETIME:
mysql>SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY);
-> 1999-01-02
mysql>SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR);
-> 1999-01-01 01:00:00
Dac folosim expresii incorecte vom obine NULL.
mysql>SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> 1998-02-28
EXTRACT(type FROM date) Tipurile intervalelor pentru funciile EXTRACT() se folosesc
aceleai ca i la DATE_ADD() sau DATE_SUB(), dar EXTRACT() putem spune c efectueaz
extragerea crorva pri din dat, i nu operaii aritmetice.
mysql>SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999
mysql>SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");->
199907
mysql>SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");-> 20102
DATE_FORMAT(date,format) Formateaz mrimea date conform indicaiilor n format. n
format se poate de folosit:
Indicator
Descriere
%M
Denumirea lunii
%W
Denumirea zilei sptmnii (duminic,...)
%D
Zilele lunii cu sufixul englez (0st, 1st, 2nd, 3rd...)
%Y
Anul 4 cifre
%y
Anul 2 cifre
Anul, pentru cazul cnd duminic e prima zi din sptmn. Anul 4 cifre. Se
%X, %x
folosete cu '%V' sau '%v'
%a
Numele zilelor prescurtat
%d
Ziua lunii (00..31)
Pagina10din14

CFBC

SGBD

Grigore Vasilache

%e
%m
%c
%b
%j
%H
%k
%h
%I
%l
%i
%r
%T
%S, %s
%p
%w
%U
%u
%V
%v
%%

## Ziua lunii (0..31)

Luna (00..12)
Luna(0..12)
Numele lunilor prescurtat
Ziua anului (001..366)
Ora (00..23)
Ora (0..23)
Ora (01..12)
Ora (01..12)
Ora (1..12)
Minute (00..59)
Timpul, formatul 12 (hh:mm:ss [AP]M)
Timpul, formatul 24 (hh:mm:ss)
Secunde (00..59)
AM sau PM
Ziua sptmnii (0=duminic,..)
Sptmna (00..53), duminic e prima n sptmn
Sptmna (00..53), luni e prima n sptmn
Sptmna (01..53), duminic e prima n sptmn. Se folosete cu '%X'
Sptmna (01..53), luni e prima n sptmn. Se folosete cu '%x'
Apare %.

## Celelalte simboluri se transcriu n expresia rezultat.:

mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b
%j');
-> '4th 97 Sat 04 10 Oct 277'
mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S
%w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql>SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
TIME_FORMAT(time,format) Analog ca DATE_FORMAT(), dar format poate conine
numai ce se refer la ore, minute i secunde. Dac se indic i altceva putem obine NULL sau 0.

Pagina11din14

CFBC

SGBD

Grigore Vasilache

## !!!Atragem atenia, c NOW() se calculeaz numai o dat pentru fiecare cerere la

nceputul ndeplinirii ei. Din acest motiv, dac ne adresm de mai multe ori la NOW() n
cadrul aceleiai cereri obinem acelai rezultat.

## Tipurile de timp i diferenele de timp cu fusurile orare

Tipul TIME WITH TIME ZONE. Acest tip de date seamn cu tipul TIME cu diferena c
valoarea tipului TIME WITH TIME ZONE conine o component adugtoare valoare, ce
indic diferena de timp fa de Grinvich (care e numit UTC universal time coordinated).
Tipul TIMESTAMP WITH TIME ZONE (lungimea depinde de numrul de simboluri la
ieire). Asemntor cu TIME

## 14.6. Funciile intervalelor de timp

La general prin intervale de timp se nelege diferena dintre dou valori de dat sau timp. n
SQL se definesc dou categorii de tipuri ale intervalelor de timp : an-lun i ziua-timpul.
Intervalele de timp a limbajului SQL nu se ataeaz la timpul de nceput i/sau de sfrit a
valorii de dat/timp, dar descriu numai durata n timp. n caz general la definirea cmpului de
tip interval de timp se indic INTERVAL start (p) [ TO end (q) ], unde n calitate destart i
end pot fi indicate YEAR, MONTH, DAY, HOUR, MINUTE i SECOND. Parametrul p
indic exactitatea necesar. Parametrul q poate fi indicat doar n cazurile, cnd n calitate de
end se folosete SECOND, i indic precizia pentru secund. Pot fi folosite urmtoarele
variaii de tipuri a intervalelor de timp:
Tipurile categorii an-lun. Se pot defini coloane de urmtoarele tipuri :
INTERVAL YEAR, INTERVAL YEAR (p) (valoarea acestor tipuri Intervalele de timp n
ani);
INTERVAL MONTH, INTERVAL MONTH (p) (valoarea acestor tipuri Intervalele de
timp n luni);
INTERVAL YEAR TO MONTH, INTERVAL YEAR (p) TO MONTH (valoarea acestor
tipuri Intervalele de timp n ani i luni ). Dac valoarea parametrului p nu se indic, prin
convenie se primete valoarea2.
Tipurile categorii ziua-timpul . La definirea cmpului pot fi folosite urmtoarele
combinaii:
INTERVAL DAY (p),
INTERVAL DAY,
INTERVAL DAY (p) TO HOUR,
INTERVAL DAY TO HOUR,
INTERVAL DAY (p) TO MINUTE,
INTERVAL DAY TO MINUTE,
INTERVAL DAY (p) TO SECOND (q),
INTERVAL DAY TO SECOND (q),

## INTERVAL DAY (p) TO SECOND,

INTERVAL DAY TO SECOND,
INTERVAL HOUR (p),
INTERVAL HOUR,
INTERVAL HOUR (p) TO MINUTE,
INTERVAL HOUR TO MINUTE,
INTERVAL HOUR (p) TO SECOND (q),
INTERVAL HOUR TO SECOND (q),
Pagina12din14

CFBC

SGBD

Grigore Vasilache

## INTERVAL HOUR TO SECOND,

INTERVAL MINUTE,
INTERVAL MINUTE TO SECOND (q),
INTERVAL MINUTE TO SECOND,
INTERVAL SECOND (p),

## INTERVAL MINUTE (p),

INTERVAL MINUTE (p) TO SECOND (q),
INTERVAL MINUTE (p) TO SECOND,
INTERVAL SECOND (p, q),
INTERVAL SECOND.
Dac valoarea parametrului p nu se indic concret, implicit se atribuie valoarea 2. Valoarea
parametrului q implicit reprezint 6.
Analizm un singur exemplu pentru tipul INTERVAL: INTERVAL 10:20 MINUTE TO
SECOND interval de timp de 10 minute i 20 secunde.
Asupra valorilor de tipuri de dat-timp pot fi efectuate operaiile aritmetice, esena crora se
definete cu ajutorul acestui tabel:
Tipul primului operand Operaia Tipul operandului al doilea Tipul rezultatului
Datetime
Datetime
Interval
Datetime
+ sau - Interval
Datetime
Interval
+
Datetime
Datetime
Interval
+ sau - Interval
Interval
Interval
* sau /
Numeric
Interval
Numeric
*
Interval
Interval
Valorile de tip de date intervale de timp se compun la scderea unei valori a tipului DATE
sau TIME din alta de acelai tip. La adunarea valorilor interval la valoarea tipului DATE sau
TIME se compune o valoare nou de tipul dat/timp. n plus, valoarea de tip interval poate fi
nmulit sau mprit la valori numerice obinnd valori noi de tip interval.

## 14.7. Funcii specifice MySQL

funcie
database()
get_lock(s,n)
md5(s)
password(s)
release_lock(s)
user()
version()
last_insert_id

Descriere
- Returneaz numele bazei de date deschise
- Obine o blocare a bazei de date
- Returneaz o suma de control a irului s, calculata dup algoritmul MD5
- Returneaz irul s, criptat folosind algoritmul aplicat de MySQL parolei
- Anuleaz blocarea unei baze de date
- Returneaz numele utilizatorului curent
- Returneaz numrul versiunii MySQL
ultima valoare inserata intr-un cmp 'auto_increment'
Dac expr1 nu e NULL, returneaz expr1, altfel ret. expr2mysql> select ifnull(1/0, exp 1
IFNULL(expr1,expr2)
is null);exp 1 is null

Pagina13din14

CFBC

SGBD

## TEMA NR. 14. PRACTIC

1. Pe ce poziie sta Tudor n lista (Anatol, Maria, Tudor, Andrei)
2. Pe ce poziie sta Vasile n lista (Anatol, Maria, Tudor, Andrei)
3. Repetai de 10 ori numele Dvoastr
4. Rsturnai irul FOARTE BINE
5. Aflai cel mai mare numr ntreg ce nu-l depete pe 12.345
6. Rotunjii numrul 1.298 pn la zecimi
7. Calculai log10 1234
8. Calculai 2525
9. Afiai cel mai mare numr din urmtorul ir 10,23,34,453,342,654
10.Transformai 12345 din 10 n 2 i din 8 n 2.

Pagina14din14

Grigore Vasilache