Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como a função FORMAT() funciona no SQL Server (T-SQL)


No SQL Server, você pode usar o T-SQL FORMAT() função para retornar valores como números e datas como strings formatadas.

Você fornece o valor a ser formatado e especifica o formato a ser usado. A função aceita um argumento opcional que permite especificar uma cultura a ser usada ao formatar o valor.


Sintaxe


A sintaxe fica assim:
FORMAT ( value, format [, culture ] )

Onde value é o valor que você deseja formatar e format é uma string de formato válida que especifica o formato desejado.

A culture opcional argumento pode ser usado para especificar uma cultura. Se omitido, o idioma da sessão atual é usado.

O FORMAT função é não determinística.

Exemplo 1 – Formatar um número


Aqui está um exemplo de formatação de um número:
SELECT FORMAT(1, 'N') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| 1.00     |
+----------+

Neste caso, usei N como a string de formato. Este é um especificador de formato numérico padrão para a saída do valor como um número. Esse especificador de formato específico resulta na formatação da saída com dígitos inteiros e decimais, separadores de grupo e um separador decimal com sinal negativo opcional. Este especificador de formato não diferencia maiúsculas de minúsculas, portanto, N ou n está bem.

Exemplo 2 – Formatar para uma moeda


Aqui está um exemplo de formatação de um número como moeda:
SELECT FORMAT(1, 'C') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| $1.00    |
+----------+

Mais formatos numéricos


Existem muitas outras strings de formato que podem ser usadas com o FORMAT() função. Por exemplo, existem strings de formato para porcentagens, ponto fixo, exponencial (científico), hexadecimal e muito mais.

As strings de formato numérico são separadas em padrão e personalizado.

Os dois artigos a seguir listam todas as strings de formato numérico, incluindo exemplos:
  • Strings de formato numérico padrão
  • Strings de formato numérico personalizado

Consulte também Como formatar números no SQL Server para obter mais exemplos de formatação de números.

Exemplo 3 – Formatar uma data


Aqui está um exemplo de formatação de uma data:
SELECT 
  GETDATE() AS 'Unformatted Date',
  FORMAT( GETDATE(), 'D') AS 'Formatted Date';

Resultado:
+-------------------------+------------------------+
| Unformatted Date        | Formatted Date         |
|-------------------------+------------------------|
| 2019-05-08 06:16:55.613 | Wednesday, May 8, 2019 |
+-------------------------+------------------------+

Neste caso, usei D que especifica um padrão de data longo.

Mais formatos de data


Há muito mais strings de formato que podem ser usadas para formatar datas. Assim como as strings de formato numérico, as strings de formato de data e hora são separadas em padrão e personalizado, para que você possa criar seus próprios formatos personalizados ou confiar em um padrão.

Os dois artigos a seguir listam todas as strings de formato de data e hora, incluindo exemplos:
  • Strings de formato padrão de data e hora
  • Strings de formato personalizado de data e hora

Consulte também Como formatar a data e hora no SQL Server para obter mais exemplos.

Exemplo 4 – A culture opcional Argumento


Aqui está um exemplo de uso da culture argumento para retornar um valor em várias moedas:
SELECT 
    FORMAT(1, 'C', 'fr-FR') AS 'France', 
    FORMAT(1, 'C', 'th-TH') AS 'Thailand', 
    FORMAT(1, 'C', 'ja-JP') AS 'Japan';

Resultado:
+----------+------------+---------+
| France   | Thailand   | Japan   |
|----------+------------+---------|
| 1,00 €   | ฿1.00      | ¥1      |
+----------+------------+---------+

O FORMAT() função aceita qualquer cultura suportada pelo .NET Framework como um argumento; ele não está limitado aos idiomas explicitamente suportados pelo SQL Server.

Se você não fornecer esse argumento, o idioma da sessão atual será usado.

Para obter mais exemplos, consulte Como as configurações de idioma podem afetar seu FORMAT() Resultados.

Exemplo 5 – culture inválida Argumento


Se você fornecer uma cultura inválida, receberá um erro:
SELECT FORMAT(1, 'C', 'oop-SS!') AS 'Oops!';

Resultado:
The culture parameter 'oop-SS!' provided in the function call is not supported.

Exemplo 6 – Valor de formato inválido


No entanto, para outros erros, a função retorna NULL . Por exemplo, veja o que acontece se eu fornecer um valor inválido para ser formatado:
SELECT FORMAT(GETDATE(), 'C') AS 'Result';

Resultado:
+----------+
| Result   |
|----------|
| NULL     |
+----------+

Nesse caso, eu estava tentando formatar uma data em uma moeda e, portanto, o resultado foi NULL .

Tipos de dados válidos


FORMAT() depende da presença do CLR (Common Language Runtime) do .NET Framework e usa as regras de formatação do CLR.

Os seguintes tipos de dados podem ser formatados com o FORMAT() função. Essa lista contém os tipos de dados aceitáveis ​​para a string de entrada junto com seus tipos equivalentes de mapeamento do .NET Framework.
Categoria Tipo tipo .NET
Numérico grande Int64
Numérico int Int32
Numérico pequeno Int16
Numérico tinyint Byte
Numérico decimal SqlDecimal
Numérico numérico SqlDecimal
Numérico flutuar Duplo
Numérico real Único
Numérico dinheiro pequeno Decimal
Numérico dinheiro Decimal
Data e hora data DataHora
Data e hora hora Intervalo de tempo
Data e hora datahora DataHora
Data e hora smalldatetime DataHora
Data e hora datahora2 DataHora
Data e hora deslocamento de data e hora DateTimeOffset

Escape de dois pontos e períodos para o tipo de dados 'time'


Ao usar FORMAT , dois pontos e pontos devem ser escapados (isso segue as regras de formatação do CLR). Portanto, quando a string de formato (segundo parâmetro) contém dois pontos ou ponto, os dois pontos ou ponto devem ser escapados com uma barra invertida quando um valor de entrada (primeiro parâmetro) for do tempo tipo de dados.

Exemplo:
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';

Resultado:
+--------------------+-------------+-----------+
| Unformatted Data   | Unescaped   | Escaped   |
|--------------------+-------------+-----------|
| 12:15:00           | NULL        | 12.15     |
+--------------------+-------------+-----------+

Então, como esperado, a string sem escape retorna NULL .

Conforme mencionado, isso se aplica apenas ao tempo tipo de dados. Se alterarmos o valor de entrada para um tipo de dados diferente, não precisamos escapar dele:
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';

Resultado:
+-------------------------+-------------+-----------+
| Unformatted Data        | Unescaped   | Escaped   |
|-------------------------+-------------+-----------|
| 1900-01-01 12:15:00.000 | 12.15       | 12.15     |
+-------------------------+-------------+-----------+

Nesse caso, o valor de entrada é datetime , e, portanto, o resultado é bom sem escapar dele.

Você também pode usar a barra invertida para escapar de qualquer outro caractere que deseja incluir na string de resultado, que de outra forma seria interpretado como um especificador de formato. Preceder um caractere com uma barra invertida significa que o caractere a seguir é um literal de caractere que deve ser incluído na string de resultado inalterada.

Em uma string personalizada de formato de data e hora, o d , f , F , g , h , H , K , m , M , y , t , y , z , : , ou / caracteres são interpretados como especificadores de formato personalizado em vez de caracteres literais.

Em uma string de formato numérico personalizado, o # , 0 , . , , , % e os símbolos são interpretados como especificadores de formato e não como caracteres literais. As letras maiúsculas e minúsculas E bem como o + e - os símbolos também podem ser interpretados como especificadores de formato, dependendo de sua posição na string de formato.

Se você precisar incluir uma barra invertida na string de resultado, escape-a com outra barra invertida.

Remoto


O FORMAT() função não pode ser remota, pois depende da presença do CLR. A remoção remota de uma função que requer o CLR pode causar um erro no servidor remoto.

Quando usar o FORMAT() Função


A Microsoft recomenda que o FORMAT() A função é usada para formatação com reconhecimento de localidade de valores de data/hora e número como strings, e para conversões gerais de tipo de dados, o CAST() ou a função CONVERT() função deve ser usada em seu lugar.