Salta el contingut

Funcions d'una sola fila

Les funcions d'una sola fila (single-row functions) s'apliquen a cada fila individualment i retornen un únic valor per fila. Es poden usar a la clàusula SELECT, WHERE, ORDER BY i HAVING.

Es diferencien de les funcions d'agregació (COUNT, SUM...) en que no col·lapsen múltiples files en un resultat: si la consulta retorna 100 files, la funció s'executa 100 vegades.

-- Exemple: aplica UPPER a cada fila individualment
SELECT UPPER(nom), LOWER(email) FROM clients;

Funcions de cadena

Conversió de majúscules i minúscules

SELECT UPPER('hola món');       -- 'HOLA MÓN'
SELECT LOWER('HOLA MÓN');       -- 'hola món'
SELECT INITCAP('hola món');     -- 'Hola Món'
SELECT UPPER('hola món');       -- 'HOLA MÓN'
SELECT LOWER('HOLA MÓN');       -- 'hola món'
-- INITCAP no existeix; alternativa amb ELT o expressió
SELECT UPPER('hola món');       -- 'HOLA MÓN'
SELECT LOWER('HOLA MÓN');       -- 'hola món'
-- No hi ha INITCAP natiu
SELECT UPPER('hola món') FROM dual;     -- 'HOLA MÓN'
SELECT LOWER('HOLA MÓN') FROM dual;     -- 'hola món'
SELECT INITCAP('hola món') FROM dual;   -- 'Hola Món'

FROM DUAL a Oracle

Oracle requereix sempre una clàusula FROM. La taula fictícia DUAL s'usa per a expressions sense taula real.


Longitud

SELECT LENGTH('Blanes');        -- 6
SELECT CHAR_LENGTH('Blanes');   -- 6 (equivalent)
SELECT LENGTH('Blanes');        -- 6 (bytes, atenció amb UTF-8!)
SELECT CHAR_LENGTH('Blanes');   -- 6 (caràcters)
SELECT LEN('Blanes');           -- 6
SELECT DATALENGTH('Blanes');    -- 6 (bytes)
SELECT LENGTH('Blanes') FROM dual;      -- 6
SELECT LENGTHB('Blanes') FROM dual;     -- 6 (bytes)

LENGTH i jocs de caràcters multibyte

A MySQL, LENGTH retorna el nombre de bytes, no de caràcters. Per a caràcters UTF-8 com à o ç (2 bytes en UTF-8), LENGTH pot retornar un valor diferent de CHAR_LENGTH. Usa sempre CHAR_LENGTH a MySQL quan treballes amb text en català o altres idiomes amb caràcters no ASCII.


Extracció de subcadena

SELECT SUBSTRING('Barcelona' FROM 1 FOR 4);  -- 'Barc'
SELECT SUBSTR('Barcelona', 1, 4);             -- 'Barc' (sinònim)
SELECT LEFT('Barcelona', 4);                  -- 'Barc'
SELECT RIGHT('Barcelona', 4);                 -- 'lona'
SELECT SUBSTRING('Barcelona', 1, 4);  -- 'Barc'
SELECT SUBSTR('Barcelona', 1, 4);     -- 'Barc' (sinònim)
SELECT LEFT('Barcelona', 4);          -- 'Barc'
SELECT RIGHT('Barcelona', 4);         -- 'lona'
SELECT SUBSTRING('Barcelona', 1, 4);  -- 'Barc'
SELECT LEFT('Barcelona', 4);          -- 'Barc'
SELECT RIGHT('Barcelona', 4);         -- 'lona'
SELECT SUBSTR('Barcelona', 1, 4) FROM dual;   -- 'Barc'
-- Oracle usa SUBSTR (no SUBSTRING)
-- Índex negatiu: compta des del final
SELECT SUBSTR('Barcelona', -4) FROM dual;     -- 'lona'

Eliminació d'espais

SELECT TRIM('  hola  ');         -- 'hola'
SELECT LTRIM('  hola  ');        -- 'hola  '
SELECT RTRIM('  hola  ');        -- '  hola'
SELECT TRIM(BOTH 'x' FROM 'xxholax');  -- 'hola'
SELECT TRIM('  hola  ');         -- 'hola'
SELECT LTRIM('  hola  ');        -- 'hola  '
SELECT RTRIM('  hola  ');        -- '  hola'
SELECT TRIM('  hola  ');         -- 'hola' (SQL Server 2017+)
SELECT LTRIM('  hola  ');        -- 'hola  '
SELECT RTRIM('  hola  ');        -- '  hola'
SELECT TRIM('  hola  ') FROM dual;             -- 'hola'
SELECT LTRIM('  hola  ') FROM dual;            -- 'hola  '
SELECT RTRIM('  hola  ') FROM dual;            -- '  hola'
SELECT TRIM(BOTH 'x' FROM 'xxholax') FROM dual;  -- 'hola'

Substitució i concatenació

-- Substitució
SELECT REPLACE('Hola món', 'món', 'world');  -- 'Hola world'

-- Concatenació amb operador
SELECT 'Hola' || ' ' || 'món';              -- 'Hola món'

-- Concatenació amb funció
SELECT CONCAT('Hola', ' ', 'món');          -- 'Hola món'
SELECT CONCAT_WS(', ', 'Girona', 'Blanes', 'Lloret');  -- 'Girona, Blanes, Lloret'
SELECT REPLACE('Hola món', 'món', 'world');
SELECT CONCAT('Hola', ' ', 'món');
SELECT CONCAT_WS(', ', 'Girona', 'Blanes', 'Lloret');
-- L'operador || no és concatenació per defecte (és OR lògic)
SELECT REPLACE('Hola món', 'món', 'world');
SELECT 'Hola' + ' ' + 'món';               -- amb +
SELECT CONCAT('Hola', ' ', 'món');
SELECT CONCAT_WS(', ', 'Girona', 'Blanes', 'Lloret');
SELECT REPLACE('Hola món', 'món', 'world') FROM dual;
SELECT 'Hola' || ' ' || 'món' FROM dual;
SELECT CONCAT('Hola', ' món') FROM dual;   -- CONCAT a Oracle accepta només 2 arguments
-- Per a mes de 2, encadena CONCATs o usa ||
SELECT CONCAT(CONCAT('Nom: ', nom), CONCAT(', Email: ', email)) FROM clients;

Rebliment i posició

SELECT LPAD('42', 6, '0');       -- '000042'
SELECT RPAD('Blanes', 10, '.');  -- 'Blanes....'

SELECT POSITION('an' IN 'Barcelona');   -- 3
SELECT STRPOS('Barcelona', 'an');       -- 3
SELECT LPAD('42', 6, '0');       -- '000042'
SELECT RPAD('Blanes', 10, '.');  -- 'Blanes....'

SELECT LOCATE('an', 'Barcelona');       -- 3
SELECT INSTR('Barcelona', 'an');        -- 3
SELECT FORMAT(42, '000000');     -- '000042' (alternativa a LPAD)

SELECT CHARINDEX('an', 'Barcelona');    -- 3
SELECT LPAD('42', 6, '0') FROM dual;       -- '000042'
SELECT RPAD('Blanes', 10, '.') FROM dual;  -- 'Blanes....'

SELECT INSTR('Barcelona', 'an') FROM dual; -- 3
-- Segon i tercer argument opcionals: INSTR(str, substr, inici, ocurrencia)
SELECT INSTR('abcabc', 'a', 1, 2) FROM dual;  -- 4 (2a ocurrencia de 'a')

AC0372/04/05 — Miniactivitat

RA4 · CA4.2

Amb la taula clients, escriviu una consulta que mostri:

  1. El nom i cognoms en majúscules concatenats en una sola columna (NOM COGNOMS)
  2. Les inicials de cada client (primera lletra del nom i primera del cognom)
  3. L'email amb el domini amagat (substituïu el domini per ***)
  4. El DNI formateig amb un guió davant de la lletra (per exemple 12345678-A)

Funcions numèriques

Arrodoniment i truncament

SELECT ROUND(3.14159, 2);    -- 3.14
SELECT ROUND(3.5);           -- 4   (arrodoneix al enter mes proper)
SELECT TRUNC(3.99);          -- 3   (trunca, no arrodoneix)
SELECT TRUNC(3.14159, 2);    -- 3.14
SELECT CEIL(3.1);            -- 4   (arrodoneix cap amunt)
SELECT FLOOR(3.9);           -- 3   (arrodoneix cap avall)
SELECT ROUND(3.14159, 2);    -- 3.14
SELECT ROUND(3.5);           -- 4
SELECT TRUNCATE(3.99, 0);    -- 3   (a MySQL cal indicar decimals)
SELECT TRUNCATE(3.14159, 2); -- 3.14
SELECT CEILING(3.1);         -- 4
SELECT FLOOR(3.9);           -- 3
SELECT ROUND(3.14159, 2);    -- 3.14
SELECT ROUND(3.5, 0);        -- 4
SELECT ROUND(3.99, 0, 1);    -- 3   (tercer arg = 1 trunca)
SELECT CEILING(3.1);         -- 4
SELECT FLOOR(3.9);           -- 3
SELECT ROUND(3.14159, 2) FROM dual;   -- 3.14
SELECT ROUND(3.5) FROM dual;          -- 4
SELECT TRUNC(3.99) FROM dual;         -- 3
SELECT TRUNC(3.14159, 2) FROM dual;   -- 3.14
SELECT CEIL(3.1) FROM dual;           -- 4
SELECT FLOOR(3.9) FROM dual;          -- 3

Valor absolut, mòdul i potència

SELECT ABS(-15);             -- 15
SELECT MOD(17, 5);           -- 2  (17 = 3*5 + 2)
SELECT 17 % 5;               -- 2  (operador %)
SELECT POWER(2, 10);         -- 1024
SELECT SQRT(144);            -- 12
SELECT 2 ^ 10;               -- 1024 (operador ^)
SELECT ABS(-15);             -- 15
SELECT MOD(17, 5);           -- 2
SELECT 17 % 5;               -- 2
SELECT POWER(2, 10);         -- 1024
SELECT SQRT(144);            -- 12
SELECT POW(2, 10);           -- 1024 (sinònim)
SELECT ABS(-15);             -- 15
SELECT 17 % 5;               -- 2  (no existeix MOD)
SELECT POWER(2, 10);         -- 1024
SELECT SQRT(144);            -- 12
SELECT ABS(-15) FROM dual;         -- 15
SELECT MOD(17, 5) FROM dual;       -- 2
SELECT POWER(2, 10) FROM dual;     -- 1024
SELECT SQRT(144) FROM dual;        -- 12

Aplicació pràctica: càlculs sobre dades

-- Preu amb IVA arrodonit a 2 decimals
SELECT nom,
       preu,
       ROUND(preu * 1.21, 2)            AS preu_iva,
       ROUND(preu * 0.21, 2)            AS import_iva
FROM productes
WHERE actiu = TRUE;

-- Percentatge d'estoc respecte al màxim
SELECT nom,
       estoc,
       estoc_maxim,
       ROUND(estoc::numeric / estoc_maxim * 100, 1) AS pct_estoc
FROM productes
WHERE estoc_maxim > 0;
SELECT nom,
       preu,
       ROUND(preu * 1.21, 2)            AS preu_iva,
       ROUND(preu * 0.21, 2)            AS import_iva
FROM productes
WHERE actiu = 1;

SELECT nom,
       estoc,
       estoc_maxim,
       ROUND(estoc / estoc_maxim * 100, 1) AS pct_estoc
FROM productes
WHERE estoc_maxim > 0;
SELECT nom,
       preu,
       ROUND(preu * 1.21, 2)            AS preu_iva,
       ROUND(preu * 0.21, 2)            AS import_iva
FROM productes
WHERE actiu = 1;

SELECT nom,
       estoc,
       estoc_maxim,
       ROUND(CAST(estoc AS DECIMAL(10,2)) / estoc_maxim * 100, 1) AS pct_estoc
FROM productes
WHERE estoc_maxim > 0;
SELECT nom,
       preu,
       ROUND(preu * 1.21, 2)            AS preu_iva,
       ROUND(preu * 0.21, 2)            AS import_iva
FROM productes
WHERE actiu = 1;

SELECT nom,
       estoc,
       estoc_maxim,
       ROUND(estoc / estoc_maxim * 100, 1) AS pct_estoc
FROM productes
WHERE estoc_maxim > 0;

AC0372/04/06 — Miniactivitat

RA4 · CA4.2

Amb la taula productes, escriviu consultes que retornin:

  1. El preu original, el preu amb IVA (21%) i el descompte del 10%, tots arrodonits a 2 decimals
  2. Les 5 taules amb estoc en múltiples de 10 mes proper (per exemple, 47 → 50)
  3. Quins productes tenen un preu que és potència exacta de 2 (2, 4, 8, 16, 32...)

Funcions de data i hora

Data i hora actuals

SELECT CURRENT_DATE;               -- 2026-03-20
SELECT CURRENT_TIME;               -- 10:34:22.123456+01
SELECT CURRENT_TIMESTAMP;          -- 2026-03-20 10:34:22.123456+01
SELECT NOW();                      -- equivalent a CURRENT_TIMESTAMP
SELECT LOCALTIME;                  -- sense zona horaria
SELECT LOCALTIMESTAMP;             -- sense zona horaria
SELECT CURDATE();                  -- 2026-03-20
SELECT CURRENT_DATE();             -- equivalent
SELECT CURTIME();                  -- 10:34:22
SELECT NOW();                      -- 2026-03-20 10:34:22
SELECT CURRENT_TIMESTAMP();        -- equivalent a NOW()
SELECT SYSDATE();                  -- hora en el moment d'execució (diferent de NOW en funcions)
SELECT CAST(GETDATE() AS DATE);    -- 2026-03-20
SELECT CAST(GETDATE() AS TIME);    -- 10:34:22
SELECT GETDATE();                  -- 2026-03-20 10:34:22.123
SELECT SYSDATETIME();              -- alta precisió (nanosegons)
SELECT GETUTCDATE();               -- hora UTC
SELECT SYSDATE FROM dual;          -- data i hora del servidor
SELECT CURRENT_DATE FROM dual;     -- data i hora de la sessió (zona horaria)
SELECT SYSTIMESTAMP FROM dual;     -- amb nanosegons i zona horaria
SELECT CURRENT_TIMESTAMP FROM dual;

Extracció de components

SELECT EXTRACT(YEAR  FROM CURRENT_DATE);   -- 2026
SELECT EXTRACT(MONTH FROM CURRENT_DATE);   -- 3
SELECT EXTRACT(DAY   FROM CURRENT_DATE);   -- 20
SELECT EXTRACT(DOW   FROM CURRENT_DATE);   -- 5 (0=diumenge)
SELECT EXTRACT(WEEK  FROM CURRENT_DATE);   -- setmana de l'any

-- Alternativa amb DATE_PART
SELECT DATE_PART('year', CURRENT_DATE);    -- 2026
SELECT YEAR(NOW());        -- 2026
SELECT MONTH(NOW());       -- 3
SELECT DAY(NOW());         -- 20
SELECT HOUR(NOW());        -- 10
SELECT MINUTE(NOW());      -- 34
SELECT SECOND(NOW());      -- 22
SELECT DAYOFWEEK(NOW());   -- 1=diumenge ... 7=dissabte
SELECT WEEK(NOW());        -- setmana de l'any
SELECT DAYNAME(NOW());     -- 'Friday'
SELECT MONTHNAME(NOW());   -- 'March'
SELECT YEAR(GETDATE());            -- 2026
SELECT MONTH(GETDATE());           -- 3
SELECT DAY(GETDATE());             -- 20
SELECT DATEPART(HOUR, GETDATE());  -- 10
SELECT DATEPART(WEEKDAY, GETDATE()); -- dia de la setmana
SELECT DATENAME(MONTH, GETDATE()); -- 'March'
SELECT EXTRACT(YEAR  FROM SYSDATE) FROM dual;   -- 2026
SELECT EXTRACT(MONTH FROM SYSDATE) FROM dual;   -- 3
SELECT EXTRACT(DAY   FROM SYSDATE) FROM dual;   -- 20
-- TO_CHAR és la forma habitual per extreure components
SELECT TO_CHAR(SYSDATE, 'YYYY') FROM dual;      -- '2026'
SELECT TO_CHAR(SYSDATE, 'MM')   FROM dual;      -- '03'
SELECT TO_CHAR(SYSDATE, 'Day')  FROM dual;      -- 'Friday   '

Aritmètica de dates

-- Sumar/restar intervals
SELECT CURRENT_DATE + INTERVAL '30 days';
SELECT CURRENT_DATE - INTERVAL '1 year';
SELECT CURRENT_TIMESTAMP + INTERVAL '2 hours 30 minutes';

-- Diferència entre dates (retorna un integer de dies)
SELECT data_fi - data_inici AS dies_entre
FROM projectes;

-- Diferència en una unitat concreta
SELECT DATE_PART('day', data_fi::timestamp - data_inici::timestamp)
FROM projectes;

-- AGE: calcula interval llegible
SELECT AGE(CURRENT_DATE, data_naixement) FROM persones;
-- retorna: '35 years 2 mons 5 days'
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY);
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR);
SELECT DATE_ADD(NOW(), INTERVAL '2:30' HOUR_MINUTE);

-- Diferència en dies
SELECT DATEDIFF(data_fi, data_inici) AS dies_entre
FROM projectes;

-- Diferència en altres unitats
SELECT TIMESTAMPDIFF(MONTH, data_inici, data_fi) AS mesos
FROM projectes;
SELECT DATEADD(DAY,   30, GETDATE());
SELECT DATEADD(YEAR, -1,  GETDATE());
SELECT DATEADD(MINUTE, 150, GETDATE());

SELECT DATEDIFF(DAY,   data_inici, data_fi) AS dies_entre
FROM projectes;
SELECT DATEDIFF(MONTH, data_inici, data_fi) AS mesos
FROM projectes;
-- Sumar dies (DATE + número = DATE)
SELECT SYSDATE + 30 FROM dual;          -- d'aquí a 30 dies
SELECT SYSDATE - 365 FROM dual;         -- fa un any

-- ADD_MONTHS: sumar mesos (respecta el final de mes)
SELECT ADD_MONTHS(SYSDATE, 3) FROM dual;

-- Diferència entre dates (retorna número de dies)
SELECT data_fi - data_inici AS dies_entre FROM projectes;

-- MONTHS_BETWEEN: diferència en mesos
SELECT MONTHS_BETWEEN(data_fi, data_inici) FROM projectes;

-- NEXT_DAY: proper dia de la setmana
SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM dual;

-- LAST_DAY: últim dia del mes
SELECT LAST_DAY(SYSDATE) FROM dual;

Format de dates

SELECT TO_CHAR(CURRENT_DATE, 'DD/MM/YYYY');          -- '20/03/2026'
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'DD-Mon-YYYY HH24:MI'); -- '20-Mar-2026 10:34'
SELECT TO_CHAR(CURRENT_DATE, 'TMDay, DD TMMonth YYYY');   -- 'Friday, 20 March 2026'

-- Conversió inversa: text a data
SELECT TO_DATE('20/03/2026', 'DD/MM/YYYY');
SELECT DATE_FORMAT(NOW(), '%d/%m/%Y');              -- '20/03/2026'
SELECT DATE_FORMAT(NOW(), '%d-%b-%Y %H:%i');        -- '20-Mar-2026 10:34'
SELECT DATE_FORMAT(NOW(), '%W, %d %M %Y');          -- 'Friday, 20 March 2026'

-- Text a data
SELECT STR_TO_DATE('20/03/2026', '%d/%m/%Y');
SELECT FORMAT(GETDATE(), 'dd/MM/yyyy');             -- '20/03/2026'
SELECT FORMAT(GETDATE(), 'dd-MMM-yyyy HH:mm');      -- '20-Mar-2026 10:34'
SELECT CONVERT(VARCHAR, GETDATE(), 103);            -- '20/03/2026' (estil 103)
SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') FROM dual;
SELECT TO_CHAR(SYSDATE, 'DD-Mon-YYYY HH24:MI') FROM dual;
SELECT TO_CHAR(SYSDATE, 'Day, DD Month YYYY') FROM dual;

-- Text a data
SELECT TO_DATE('20/03/2026', 'DD/MM/YYYY') FROM dual;

-- Text a timestamp
SELECT TO_TIMESTAMP('20/03/2026 10:34:22', 'DD/MM/YYYY HH24:MI:SS') FROM dual;

Emmagatzemar dates vs. cadenes

Mai emmagatzemeu dates com a text (VARCHAR). Useu sempre els tipus nadius de data (DATE, TIMESTAMP). Emmagatzemar '20/03/2026' com a text impedeix comparacions, ordenació correcta, aritmètica de dates i aprofitar índexos de rang. TO_CHAR i DATE_FORMAT s'usen per presentar dates, no per guardar-les.

AC0372/04/07 — Miniactivitat

RA4 · CA4.2

Amb les taules clients i comandes:

  1. Mostreu els clients amb el format 'Cognom, Nom (alta: DD/MM/YYYY)' en una sola columna
  2. Calculeu l'antiguitat de cada client en anys complets des de data_alta
  3. Mostreu totes les comandes del mes actual, amb la data formatejada i els dies que fa que es va fer
  4. Quins clients van donar-se d'alta en un dilluns? (pista: useu la funció d'extracció del dia de la setmana)

Conversió de tipus (CAST)

La funció CAST converteix un valor d'un tipus a un altre. És estàndard SQL i funciona a tots els motors.

SELECT CAST('42' AS INTEGER);
SELECT CAST(42 AS TEXT);
SELECT CAST('2026-03-20' AS DATE);
SELECT CAST(3.99 AS INTEGER);       -- 3 (trunca)

-- Sintaxi alternativa PostgreSQL
SELECT '42'::INTEGER;
SELECT 42::TEXT;
SELECT '2026-03-20'::DATE;
SELECT CAST('42' AS UNSIGNED);
SELECT CAST(42 AS CHAR);
SELECT CAST('2026-03-20' AS DATE);
SELECT CONVERT('42', UNSIGNED);     -- alternativa
SELECT CAST('42' AS INT);
SELECT CAST(42 AS VARCHAR(10));
SELECT CAST('2026-03-20' AS DATE);
SELECT CONVERT(INT, '42');          -- alternativa amb estil opcional
SELECT TRY_CAST('abc' AS INT);      -- retorna NULL si falla (no error)
SELECT CAST('42' AS NUMBER) FROM dual;
SELECT CAST(42 AS VARCHAR2(10)) FROM dual;
SELECT CAST('2026-03-20' AS DATE) FROM dual;
-- Oracle prefereix TO_NUMBER, TO_CHAR i TO_DATE per a conversions amb format
SELECT TO_NUMBER('42') FROM dual;
SELECT TO_CHAR(42) FROM dual;

Funcions de conversió amb format

Mentre CAST fa conversions de tipus simples, les funcions TO_CHAR, TO_NUMBER i TO_DATE permeten especificar una màscara de format per controlar com es representa o interpreta el valor. Son especialment útils per formatar números amb separadors de milers, moneda o percentatge.

TO_CHAR: número a cadena

-- Separador de milers i decimals fixes
SELECT TO_CHAR(1234567.89, 'FM9,999,999.00');   -- '1,234,567.89'

-- Zeros a l'esquerra
SELECT TO_CHAR(42, 'FM000000');                  -- '000042'

-- Símbol de moneda local (L)
SELECT TO_CHAR(1234.5, 'FML9,999.99');

-- Percentatge
SELECT TO_CHAR(0.1534, 'FM90.99%');             -- '15.34%'
-- MySQL usa FORMAT() per a números amb separadors
SELECT FORMAT(1234567.89, 2);                    -- '1,234,567.89'

-- Amb localització (MySQL 8.0+)
SELECT FORMAT(1234567.89, 2, 'de_DE');           -- '1.234.567,89'

-- Conversió a cadena sense format
SELECT CAST(42 AS CHAR);                         -- '42'
-- FORMAT() usa màscares .NET
SELECT FORMAT(1234567.89, 'N2');                 -- '1,234,567.89'
SELECT FORMAT(1234567.89, 'C2');                 -- '$1,234,567.89' (moneda)
SELECT FORMAT(42, 'D6');                         -- '000042'
SELECT FORMAT(0.1534, 'P1');                     -- '15.3%'
-- TO_CHAR(número, màscara)
SELECT TO_CHAR(1234567.89, 'FM9,999,999.99') FROM dual;   -- '1,234,567.89'
SELECT TO_CHAR(42, 'FM000000') FROM dual;                  -- '000042'
SELECT TO_CHAR(1234.5, 'FML9,999.99') FROM dual;          -- símbol moneda local
SELECT TO_CHAR(0.1534, 'FM90.99%') FROM dual;             -- '15.34%'

-- G i D per a separadors amb consciència de locale
SELECT TO_CHAR(1234.56, 'FM9G999D99') FROM dual;          -- '1,234.56'

Màscares de format numèric Oracle

Element Significat Exemple
9 Dígit (espai si no és necessari) 999' 42'
0 Dígit amb zero forçat 000'042'
G Separador de milers (locale) 9G999'1,234'
D Separador decimal (locale) 99D99'42.50'
FM Fill Mode: elimina espais i zeros superflus FM999'42'
L Símbol moneda local L999'€42'
$ Signe dòlar literal $999'$42'
S Signe + o - S999'+42'

TO_NUMBER: cadena a número

SELECT TO_NUMBER('1,234,567.89', '9,999,999.99');    -- 1234567.89
SELECT TO_NUMBER('000042', '000000');                  -- 42
-- MySQL no té TO_NUMBER; cal netejar la cadena i usar CAST
SELECT CAST('1234567.89' AS DECIMAL(12,2));
SELECT CAST(REPLACE('1,234,567.89', ',', '') AS DECIMAL(12,2));  -- 1234567.89
-- SQL Server usa CAST, TRY_CAST o TRY_PARSE
SELECT CAST('1234567.89' AS DECIMAL(12,2));
-- TRY_PARSE: accepta cadenes amb format de locale (retorna NULL si falla)
SELECT TRY_PARSE('1,234,567.89' AS DECIMAL(12,2) USING 'en-US');
SELECT TO_NUMBER('1,234,567.89', '9,999,999.99') FROM dual;    -- 1234567.89
SELECT TO_NUMBER('000042', '000000') FROM dual;                  -- 42

-- Separadors europeus (punt miler, coma decimal)
SELECT TO_NUMBER('1.234.567,89', '9G999G999D99',
                 'NLS_NUMERIC_CHARACTERS = '',.''') FROM dual;

TO_DATE i TO_TIMESTAMP

Ja cobertes a la secció Format de dates, però aquí es resumeixen les equivalències entre motors:

SELECT TO_DATE('20/03/2026', 'DD/MM/YYYY');
SELECT TO_TIMESTAMP('20/03/2026 10:34:22', 'DD/MM/YYYY HH24:MI:SS');
-- STR_TO_DATE és l'equivalent de TO_DATE
SELECT STR_TO_DATE('20/03/2026', '%d/%m/%Y');
SELECT STR_TO_DATE('20/03/2026 10:34:22', '%d/%m/%Y %H:%i:%s');
-- PARSE accepta cadenes en format de locale
SELECT PARSE('20/03/2026' AS DATE USING 'es-ES');
SELECT TRY_PARSE('20/03/2026' AS DATE USING 'es-ES');  -- NULL si falla
SELECT TO_DATE('20/03/2026', 'DD/MM/YYYY') FROM dual;
SELECT TO_TIMESTAMP('20/03/2026 10:34:22', 'DD/MM/YYYY HH24:MI:SS') FROM dual;

-- Amb zona horaria
SELECT TO_TIMESTAMP_TZ('20/03/2026 10:34:22 +01:00',
                       'DD/MM/YYYY HH24:MI:SS TZH:TZM') FROM dual;

Màscares de format de data Oracle

Màscara Significat Exemple
YYYY Any de 4 dígits 2026
MM Mes numèric 03
DD Dia del mes 20
HH24 Hora en format 24h 10
MI Minuts 34
SS Segons 22
DY Nom curt del dia FRI
DAY Nom complet del dia FRIDAY
MON Mes abreujat MAR
MONTH Mes complet MARCH

AC0372/04/08 — Miniactivitat

RA4 · CA4.2

Practiqueu les funcions de conversió amb format:

  1. Formateu el preu de cada producte com a cadena amb 2 decimals, separador de milers i símbol €.
  2. Convertiu la cadena '15.234,75' (format europeu) a un valor numèric de la vostra BD.
  3. Mostreu la data_alta de cada client en el format 'Divendres, 20 de Març de 2026'.
  4. Construïu una columna calculada referencia que combini l'id del client amb la data en format CLI-00042-20260320.

Conversions implícites

Alguns motors fan conversions implícites (per exemple, comparar un INTEGER amb un VARCHAR que conté un número pot funcionar). Eviteu confiar-hi: les conversions implícites poden causar comportaments inesperats, impedir l'ús d'índexos i generar errors subtils en migrar entre motors.