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

Como especificar a cultura invariável ao usar FORMAT() no SQL Server


No SQL Server, você pode usar o FORMAT() função para formatar valores de data/hora e número como strings. Em particular, a função fornece formatação "com reconhecimento de localidade" e a função aceita um argumento "cultura", que permite especificar uma cultura ou idioma a ser usado para o formato real. Por exemplo, você pode passar en-us para garantir que os resultados sejam formatados no formato inglês dos EUA.

O argumento culture é opcional, portanto, se você não o fornecer, a saída será determinada pelo idioma da sessão atual.

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

Uma das culturas suportadas pelo .NET Framework é a cultura invariável. A cultura invariável é insensível à cultura. Mais especificamente, essa cultura está associada ao idioma inglês, mas não a nenhum país/região.

Para especificar que FORMAT() deve produzir os resultados usando a cultura invariável, basta usar "iv" para o argumento da cultura (o terceiro argumento).


Exemplo 1 – Moeda


Aqui está um exemplo de formatação de um valor como moeda usando a cultura invariável.
SELECT FORMAT(123, 'C', 'iv') Result;

Resultados:
+----------+
| Result   |
|----------|
| ¤123.00  |
+----------+

Isso resulta na saída com uma parte fracionária com uma casa decimal. Também é precedido pelo sinal de moeda (¤), que é usado para denotar uma moeda não especificada (este é o caractere Unicode U+00A4).

Exemplo 2 – Data


Aqui está um exemplo de formatação de uma data usando a cultura invariável junto com um formato de data curto.
DECLARE @date date = '2030-05-25';
SELECT FORMAT(@date, 'd', 'iv') Result;

Resultados:
+------------+
| Result     |
|------------|
| 05/25/2030 |
+------------+

O formato de data abreviado para a cultura invariável é MM/dd/aaaa.

Aqui está novamente, mas desta vez eu comparo com as culturas inglesa, britânica e alemã (deutsch) dos EUA.
DECLARE @date date = '2030-05-25';
SELECT 
  FORMAT(@date, 'd', 'iv') 'Invariant Culture',
  FORMAT(@date, 'd', 'en-us') 'US English',
  FORMAT(@date, 'd', 'en-gb') 'British',
  FORMAT(@date, 'd', 'de-de') 'German (Deutsch)';

Resultados:
+---------------------+--------------+------------+--------------------+
| Invariant Culture   | US English   | British    | German (Deutsch)   |
|---------------------+--------------+------------+--------------------|
| 05/25/2030          | 5/25/2030    | 25/05/2030 | 25.05.2030         |
+---------------------+--------------+------------+--------------------+

Exemplo 3 - Todos os formatos padrão de data e hora


Aqui está outro usando a cultura invariável, mas desta vez eu formato um datetimeoffset value usando todas as cadeias de caracteres de formato de data e hora padrão suportadas pelo .NET Framework.
DECLARE @date datetimeoffset, @culture char(2); 
SET @date = '2030-05-25 23:59:30.1234567 +07:00';
SET @culture = 'iv';
SELECT 
  FORMAT(@date, 'd', @culture) AS 'd',
  FORMAT(@date, 'D', @culture) AS 'D',
  FORMAT(@date, 'f', @culture) AS 'f',
  FORMAT(@date, 'F', @culture) AS 'F',
  FORMAT(@date, 'g', @culture) AS 'g',
  FORMAT(@date, 'G', @culture) AS 'G',
  FORMAT(@date, 'm', @culture) AS 'm',
  FORMAT(@date, 'M', @culture) AS 'M',
  FORMAT(@date, 'o', @culture) AS 'o',
  FORMAT(@date, 'O', @culture) AS 'O',
  FORMAT(@date, 'r', @culture) AS 'r',
  FORMAT(@date, 'R', @culture) AS 'R',
  FORMAT(@date, 's', @culture) AS 's',
  FORMAT(@date, 't', @culture) AS 't',
  FORMAT(@date, 'T', @culture) AS 'T',
  FORMAT(@date, 'u', @culture) AS 'u',
  FORMAT(@date, 'U', @culture) AS 'U',
  FORMAT(@date, 'y', @culture) AS 'y',
  FORMAT(@date, 'Y', @culture) AS 'Y';

Resultado (usando saída vertical):
d | 05/25/2030
D | Saturday, 25 May 2030
f | Saturday, 25 May 2030 23:59
F | Saturday, 25 May 2030 23:59:30
g | 05/25/2030 23:59
G | 05/25/2030 23:59:30
m | May 25
M | May 25
o | 2030-05-25T23:59:30.1234567+07:00
O | 2030-05-25T23:59:30.1234567+07:00
r | Sat, 25 May 2030 16:59:30 GMT
R | Sat, 25 May 2030 16:59:30 GMT
s | 2030-05-25T23:59:30
t | 23:59
T | 23:59:30
u | 2030-05-25 16:59:30Z
U | NULL
y | 2030 May
Y | 2030 May

A cultura invariável não funciona no seu sistema?


Se você não conseguir fazer com que a cultura invariável funcione em seu sistema, pode ser devido à instalação de uma versão mais antiga do .NET Framework. A documentação do .NET Framework 4.8 declara explicitamente que a cultura invariável está disponível usando seu código de duas letras ISO 639-1 "iv" .

No entanto, nesta pergunta do Stack Overflow, a resposta de Solomon Rutzky sugere que isso pode estar disponível apenas no .NET 4.5.

Se você não conseguir fazê-lo funcionar usando uma versão anterior do .NET, tente atualizar para a versão mais recente (ou uma versão de pelo menos 4.5).