In SQL Server, si può usare la funzione T-SQL FORMAT()
per restituire valori come numeri e date come stringhe formattate.
Si fornisce il valore da formattare e si specifica il formato da usare. La funzione accetta un argomento opzionale che permette di specificare una cultura da usare quando si formatta il valore.
Sintassi
La sintassi è questa:
FORMAT ( value, format )
dove value
è il valore da formattare, e format
è una stringa di formato valida che specifica il formato desiderato.
L’argomento opzionale culture
può essere usato per specificare una cultura. Se omesso, viene usata la lingua della sessione corrente.
La funzione FORMAT
non è deterministica.
Esempio 1 – Formattare un numero
Ecco un esempio di formattazione di un numero:
SELECT FORMAT(1, 'N') AS Result;
Risultato:
+----------+| Result ||----------|| 1.00 |+----------+
In questo caso, ho usato N
come stringa di formato. Questo è uno specificatore di formato numerico standard per emettere il valore come numero. Questo particolare specificatore di formato fa sì che l’output sia formattato con cifre integrali e decimali, separatori di gruppo e un separatore decimale con segno negativo opzionale. Questo specificatore di formato è case-insensitive, quindi sia N
che n
vanno bene.
Esempio 2 – Formattare in una valuta
Ecco un esempio di formattazione di un numero come valuta:
SELECT FORMAT(1, 'C') AS Result;
Risultato:
+----------+| Result ||----------|| $1.00 |+----------+
Altri formati numerici
Ci sono molte altre stringhe di formato che possono essere usate con la funzione FORMAT()
. Per esempio, ci sono stringhe di formato per le percentuali, a virgola fissa, esponenziale (scientifico), esadecimale, e altro ancora.
Le stringhe di formato numerico sono separate in standard e personalizzate.
I seguenti due articoli elencano tutte le stringhe di formato numerico, compresi gli esempi:
- Stringhe di formato numerico standard
- Stringhe di formato numerico personalizzate
Vedi anche Come formattare i numeri in SQL Server per altri esempi di formattazione dei numeri.
Esempio 3 – Formattare una data
Ecco un esempio di formattazione di una data:
SELECT GETDATE() AS 'Unformatted Date', FORMAT( GETDATE(), 'D') AS 'Formatted Date';
Risultato:
+-------------------------+------------------------+| Unformatted Date | Formatted Date ||-------------------------+------------------------|| 2019-05-08 06:16:55.613 | Wednesday, May 8, 2019 |+-------------------------+------------------------+
In questo caso, ho usato D
che specifica un modello di data lungo.
Altri formati di data
Ci sono molte altre stringhe di formato che possono essere usate per formattare le date. Come per le stringhe di formato numerico, le stringhe di formato di data e ora sono separate in standard e personalizzate, così puoi costruire i tuoi formati personalizzati, o puoi affidarti a uno standard.
I seguenti due articoli elencano tutte le stringhe di formato di data e ora, compresi gli esempi:
- Stringhe di formato di data e ora standard
- Stringhe di formato di data e ora personalizzate
Vedi anche Come formattare la data & ora in SQL Server per altri esempi.
Esempio 4 – L’argomento cultura opzionale
Ecco un esempio di utilizzo dell’argomento culture
per restituire un valore in varie valute:
SELECT FORMAT(1, 'C', 'fr-FR') AS 'France', FORMAT(1, 'C', 'th-TH') AS 'Thailand', FORMAT(1, 'C', 'ja-JP') AS 'Japan';
Risultato:
+----------+------------+---------+| France | Thailand | Japan ||----------+------------+---------|| 1,00 € | ฿1.00 | ¥1 |+----------+------------+---------+
La funzione FORMAT()
accetta qualsiasi cultura supportata dal .NET Framework come argomento; non è limitata alle lingue esplicitamente supportate da SQL Server.
Se non si fornisce questo argomento, viene utilizzata la lingua della sessione corrente.
Per ulteriori esempi, vedere Come le impostazioni della lingua possono influenzare i risultati FORMAT()
.
Esempio 5 – Argomento cultura non valida
Se fornisci una cultura non valida, otterrai un errore:
SELECT FORMAT(1, 'C', 'oop-SS!') AS 'Oops!';
Risultato:
The culture parameter 'oop-SS!' provided in the function call is not supported.
Esempio 6 – Valore di formato non valido
Invece, per altri errori, la funzione restituisce NULL
. Per esempio, ecco cosa succede se fornisco un valore non valido da formattare:
SELECT FORMAT(GETDATE(), 'C') AS 'Result';
Risultato:
+----------+| Result ||----------|| NULL |+----------+
In questo caso, stavo cercando di formattare una data in una valuta, e quindi il risultato era NULL
.
Tipi di dati validi
FORMAT()
si basa sulla presenza del .NET Framework Common Language Runtime (CLR), e usa le regole di formattazione del CLR.
I seguenti tipi di dati possono essere formattati con la funzione FORMAT()
. Questa lista contiene i tipi di dati accettabili per la stringa di input insieme ai loro tipi equivalenti di mappatura del .NET Framework.
Categoria | Tipo | .NET | |
---|---|---|---|
Numerico | bigint | Int64 | |
Numerico | int | Int32 | |
Numerico | smallint | Int16 | |
Numerico | tinyint | Byte | |
Numerico | decimale | SqlDecimal | |
Numerico | numerico | SqlDecimal | |
Numerico | float | Doppio | |
Numerico | reale | Singolo | |
Numerico | Moneta | Decimale | |
Numerico | denaro | Decimale | |
Data e ora | data | DateTime | |
Data e ora | time | TimeSpan | |
Data e Ora | datetime | DateTime | |
Data e Ora | smalldatetime | DateTime | |
Data e ora | datetime2 | DateTime | |
Data e ora | datetimeoffset | DateTimeOffset |
Escaping di punti e virgole per il tipo di dati ‘time’
Quando si usa FORMAT
, i due punti e le virgole devono essere separati (questo aderisce alle regole di formattazione del CLR). Pertanto, quando la stringa di formato (secondo parametro) contiene un due punti o un punto, i due punti o il punto devono essere evasi con un backslash quando un valore di input (primo parametro) è di tipo tempo.
Esempio:
SELECT CAST('12:15' AS time) AS 'Unformatted Data', FORMAT(CAST('12:15' AS time), N'hh.mm') AS 'Unescaped', FORMAT(CAST('12:15' AS time), N'hh\.mm') AS 'Escaped';
Risultato:
+--------------------+-------------+-----------+| Unformatted Data | Unescaped | Escaped ||--------------------+-------------+-----------|| 12:15:00 | NULL | 12.15 |+--------------------+-------------+-----------+
Quindi, come previsto, la stringa senza escape restituisce NULL
.
Come detto, questo vale solo per il tipo di dati tempo. Se cambiamo il valore di input con un altro tipo di dati, non abbiamo bisogno di fare l’escape:
SELECT CAST('12:15' AS datetime) AS 'Unformatted Data', FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Unescaped', FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Escaped';
Risultato:
+-------------------------+-------------+-----------+| Unformatted Data | Unescaped | Escaped ||-------------------------+-------------+-----------|| 1900-01-01 12:15:00.000 | 12.15 | 12.15 |+-------------------------+-------------+-----------+
In questo caso, il valore di input è datetime, e quindi, il risultato va bene senza fare l’escape.
Si può anche usare il backslash per mettere sotto escape qualsiasi altro carattere che si vuole includere nella stringa del risultato, che altrimenti verrebbe interpretato come uno specificatore di formato. Precedere un carattere con un backslash significa che il carattere seguente è un letterale di carattere che dovrebbe essere incluso nella stringa del risultato senza modifiche.
In una stringa di formato data e ora personalizzata, il d
f
F
g
h
H
K
m
M
s
t
y
z
:
, o /
sono interpretati come specificatori di formato personalizzati piuttosto che come caratteri letterali.
In una stringa di formato numerico personalizzato, i caratteri #
0
.
,
%
, e ‰
simboli sono interpretati come specificatori di formato piuttosto che come caratteri letterali. Le lettere maiuscole e minuscole E
così come i simboli +
e -
possono anche essere interpretati come specificatori di formato, a seconda della loro posizione nella stringa di formato.
Se avete bisogno di includere un backslash nella stringa del risultato, fate l’escape con un altro backslash.
Remoto
La funzione FORMAT()
non può essere remotata poiché dipende dalla presenza del CLR. Rimuovere una funzione che richiede il CLR potrebbe causare un errore sul server remoto.
Quando usare la funzione FORMAT()
Microsoft raccomanda di usare la funzione FORMAT()
per la formattazione locale di valori di data/ora e numeri come stringhe, e che per le conversioni generali del tipo di dati, si usi invece la funzione CAST()
o la funzione CONVERT()
.