Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funziona la funzione FORMAT() in SQL Server (T-SQL)

In SQL Server è possibile utilizzare T-SQL FORMAT() funzione per restituire valori come numeri e date come stringhe formattate.

Fornisci il valore da formattare e specifichi il formato da utilizzare. La funzione accetta un argomento facoltativo che consente di specificare le impostazioni cultura da utilizzare durante la formattazione del valore.

Sintassi

La sintassi è questa:

FORMAT ( value, format [, culture ] )

Dove value è il valore che vuoi formattare e format è una stringa di formato valida che specifica il formato desiderato.

La culture facoltativa argomento può essere usato per specificare una cultura. Se omesso, viene utilizzata la lingua della sessione corrente.

Il FORMAT la funzione 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 è un identificatore di formato numerico standard per l'output del valore come numero. Questo particolare identificatore di formato comporta la formattazione dell'output con cifre integrali e decimali, separatori di gruppo e un separatore decimale con segno negativo opzionale. Questo identificatore di formato non fa distinzione tra maiuscole e minuscole, quindi N o n va bene.

Esempio 2:formattazione in una valuta

Ecco un esempio di formattazione di un numero come valuta:

SELECT FORMAT(1, 'C') AS Result;

Risultato:

+----------+
| Result   |
|----------|
| $1.00    |
+----------+

Più formati numerici

Ci sono molte altre stringhe di formato che possono essere utilizzate con FORMAT() funzione. Ad esempio, esistono stringhe di formato per percentuali, virgola fissa, esponenziale (scientifica), esadecimale e altro.

Le stringhe di formato numerico sono separate in standard e personalizzate.

I due articoli seguenti elencano tutte le stringhe di formato numerico, inclusi 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:formattazione di 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 lunga.

Più formati di data

Esistono molte altre stringhe di formato che possono essere utilizzate per la formattazione delle date. Come per le stringhe di formato numerico, le stringhe di formato di data e ora sono separate in standard e personalizzate, quindi puoi creare i tuoi formati personalizzati oppure puoi fare affidamento su uno standard.

I due articoli seguenti elencano tutte le stringhe di formato di data e ora, inclusi gli esempi:

  • Stringhe di formato di data e ora standard
  • Stringhe di formato di data e ora personalizzate

Vedi anche Come formattare la data e l'ora in SQL Server per altri esempi.

Esempio 4 – La culture opzionale Argomento

Ecco un esempio di utilizzo della culture argomento 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      |
+----------+------------+---------+

Il FORMAT() la funzione accetta qualsiasi cultura supportata da .NET Framework come argomento; non è limitato ai linguaggi esplicitamente supportati da SQL Server.

Se non fornisci questo argomento, viene utilizzata la lingua della sessione corrente.

Per ulteriori esempi, vedi Come le impostazioni della lingua possono influenzare il tuo FORMAT() Risultati.

Esempio 5:culture non valida Argomento

Se fornisci una cultura non valida, riceverai 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 formato non valido

Tuttavia, per altri errori, la funzione restituisce NULL . Ad 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 è stato NULL .

Tipi di dati validi

FORMAT() si basa sulla presenza di .NET Framework Common Language Runtime (CLR) e utilizza le regole di formattazione CLR.

I seguenti tipi di dati possono essere formattati con FORMAT() funzione. Questo elenco contiene i tipi di dati accettabili per la stringa di input insieme ai relativi tipi equivalenti di mapping di .NET Framework.

Categoria Tipo tipo .NET
Numero bigint Int64
Numero int Int32
Numero piccolo Int16
Numero tinyint Byte
Numero decimale SqlDecimale
Numero numerico SqlDecimale
Numero galleggiante Doppio
Numero reale Singolo
Numero piccoli soldi Decimale
Numero soldi Decimale
Data e ora data DataOra
Data e ora ora Intervallo di tempo
Data e ora dataora DataOra
Data e ora smalldatetime DataOra
Data e ora dataora2 DataOra
Data e ora datatimeoffset DateTimeOffset

Escape di due punti e punti per il tipo di dati "ora"

Quando si utilizza FORMAT , due punti e punti devono essere evitati (questo aderisce alle regole di formattazione CLR). Pertanto, quando la stringa di formato (secondo parametro) contiene i due punti o un punto, i due punti o il punto devono essere sottoposti a escape con una barra rovesciata quando un valore di input (primo parametro) è del tempo tipo di dati.

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 caratteri di escape restituisce NULL .

Come accennato, questo vale solo per il tempo tipo di dati. Se modifichiamo il valore di input in un tipo di dati diverso, non è necessario eseguirne 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 sfuggirgli.

Puoi anche usare la barra rovesciata per sfuggire a qualsiasi altro carattere che desideri includere nella stringa del risultato, che altrimenti verrebbe interpretato come identificatore di formato. Far precedere un carattere da una barra rovesciata significa che il carattere seguente è un carattere letterale che dovrebbe essere incluso nella stringa del risultato invariato.

In una stringa di formato data e ora personalizzata, il d , f , F , g , h , H , K , m , M , s , t , y , z , : o / i caratteri vengono interpretati come identificatori di formato personalizzati anziché come caratteri letterali.

In una stringa di formato numerico personalizzata, il # , 0 , . , , , % e i simboli vengono interpretati come identificatori di formato anziché come caratteri letterali. La E maiuscola e minuscola così come il + e - i simboli possono anche essere interpretati come identificatori di formato, a seconda della loro posizione all'interno della stringa di formato.

Se devi includere una barra rovesciata nella stringa del risultato, esegui l'escape con un'altra barra rovesciata.

Remote

Il FORMAT() funzione non può essere remotata in quanto dipende dalla presenza del CLR. Remotare una funzione che richiede il CLR, potrebbe causare un errore sul server remoto.

Quando utilizzare il FORMAT() Funzione

Microsoft consiglia che il FORMAT() viene utilizzata per la formattazione in base alle impostazioni locali di data/ora e valori numerici come stringhe e per conversioni generali del tipo di dati, sia il CAST() o la funzione CONVERT() dovrebbe essere utilizzata invece la funzione.