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

Como as configurações de idioma podem afetar seus resultados FORMAT() no SQL Server (Exemplos de T-SQL)


Pode ser fácil esquecer que o T-SQL FORMAT() A função fornece formatação com reconhecimento de localidade. Com reconhecimento de localidade significa que a localidade pode afetar os resultados. Em outras palavras, a saída exata que você obtém dependerá da localidade.

Por padrão, a função usa o idioma da sessão atual para determinar a localidade. No entanto, isso pode ser substituído passando um argumento “cultura” para a função. Isso permite que você forneça resultados para uma localidade específica sem precisar alterar o idioma da sessão atual.

Este artigo contém exemplos de como a localidade pode afetar os resultados ao usar o FORMAT() função no SQL Server.


Exemplo 1 – Moedas


Aqui está um exemplo rápido para demonstrar como o idioma/cultura pode afetar seus resultados ao formatar números.
DECLARE @num decimal(6,2) =1234.56;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en-gb ') 'pt-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl', FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';

Resultados:
+-----------+-----------+-----------+---------- --+------------+--------------+| pt-br | pt-gb | th-th | nl-nl | ne-np | fa-ir ||-----------+-----------+-----------+--------- ---+------------+--------------|| US$ 1.234,56 | £1.234,56 | 1.234,56 | € 1.234,56 | Valor 1.234,56 | 1.234/56 ريال |+-----------+-----------+-----------+--------- ---+------------+--------------+

O C neste exemplo é um especificador de formato numérico padrão. Esse caractere único especifica que o valor deve ser formatado de uma determinada maneira (neste caso, como uma moeda). Felizmente, o SQL Server é inteligente o suficiente para saber que nem todas as culturas usam o mesmo formato e apresenta automaticamente um formato diferente dependendo da cultura.

No exemplo acima, cada vez que eu chamo FORMAT() , passo a mesma string de valor e formato. A única diferença é o valor do argumento da cultura. Isso faz com que os resultados sejam diferentes, dependendo da cultura que está sendo usada. O símbolo da moeda e seu posicionamento são determinados pela cultura. O caractere usado para separadores decimais e separadores de grupo também é determinado pela cultura.

Exemplo 2 – Valores negativos


A formatação também pode depender se o valor é positivo ou negativo. Se usarmos um valor negativo, eis o que acontece:
DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en- gb') 'pt-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl' , FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';

Resultados:
+---------+---------+---------+---------+------ ---+-----------+| pt-br | pt-gb | th-th | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+-----------|| (US$ 1,23) | -£1,23 | -฿1.23 | € -1,23 | -रु 1.23 | 1/23-ريال |+---------+---------+---------+---------+--- ------+-----------+

Em algumas culturas, o sinal de menos aparece antes do sinal da moeda, em outras aparece depois. Mas em outras culturas, não há sinal de menos – ele é substituído por parênteses que cercam todo o resultado, incluindo o sinal da moeda.

No entanto, não devemos presumir que as mesmas regras sejam aplicadas em todas as strings de formato. Por exemplo, se o formatarmos como um número em vez de uma moeda, não obteremos nenhum parêntese:
DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'N', 'en-us') 'en-us', FORMAT(@num, 'N', 'en- gb') 'pt-gb', FORMAT(@num, 'N', 'th-th') 'th-th', FORMAT(@num, 'N', 'nl-nl') 'nl-nl' , FORMAT(@num, 'N', 'ne-np') 'ne-np', FORMAT(@num, 'N', 'fa-ir') 'fa-ir';

Resultados:
+---------+---------+---------+---------+------ ---+---------+| pt-br | pt-gb | th-th | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+---------|| -1,23 | -1,23 | -1,23 | -1,23 | -1,23 | 1/23- |+---------+---------+---------+---------+---- -----+-------------+

Exemplo 3 – Datas e Horários


A formatação de números não é a única coisa que é afetada pela cultura. Datas e horas, por exemplo, também serão formatadas de forma diferente dependendo da cultura.
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'G', 'pt-br') 'pt-br', FORMAT(@date , 'G', 'en-gb') 'pt-gb', FORMAT(@date, 'G', 'th-th') 'th-th', FORMAT(@date, 'G', 'nl- nl') 'nl-nl', FORMAT(@date, 'G', 'ne-np') 'ne-np', FORMAT(@date, 'G', 'fa-ir') 'fa-ir';

Resultados (usando saída vertical):
pt-br | 15/06/2019 13:45:30 Men-gb | 15/06/2019 13:45:30-th | 15/6/2562 13:45:30nl-nl | 15-6-2019 13:45:30ne-np | 15/06/2019 1:45:30 अपराह्नfa-ir | 25/03/1398 01:45:30 ب.ظ

Este exemplo usa um formato geral de data/hora longo (obtido usando G – um dos especificadores de formato de data e hora padrão), e as diferenças entre as culturas são óbvias.

Mas também podemos ver diferenças mesmo ao usar um formato de data longo:
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'F', 'pt-br') 'pt-br', FORMAT(@date , 'F', 'en-gb') 'pt-gb', FORMAT(@date, 'F', 'th-th') 'th-th', FORMAT(@date, 'F', 'nl- nl') 'nl-nl', FORMAT(@date, 'F', 'ne-np') 'ne-np', FORMAT(@date, 'F', 'fa-ir') 'fa-ir';

Resultados (usando saída vertical):
pt-br | sábado, 15 de junho de 2019 13:45:30 Men-gb | 15 de junho de 2019 13:45:30-th | 15 de agosto 2562 13:45:30nl-nl | dia 15 de junho de 2019 13:45:30ne-np | शनिवार, 15 de agosto de 2019 1:45:30 अपराह्नfa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ

Exemplo 4 – E as strings de formato personalizado?


Os exemplos anteriores usam strings de formato padrão, que praticamente fazem a formatação para você. É como uma forma abreviada de especificar uma string de formato personalizado. Um especificador de formato personalizado, por outro lado, permite especificar exatamente quais caracteres aparecem na saída e para onde eles vão. No entanto, isso normalmente significa que você precisa usar mais especificadores de formato em sua string de formato.

Mas mesmo quando você usa especificadores de formato personalizados, a saída exata também pode depender da localidade. Se quiséssemos usar uma string personalizada de formato de data e hora para imitar o exemplo anterior, poderíamos fazer algo assim:
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'dddd, dd MMMM aaaa hh:mm:ss tt', 'en-us') 'pt-br', FORMAT(@data, 'dddd, dd MMMM aaaa hh:mm:ss tt', 'pt-gb') 'pt-gb', FORMAT(@data, 'dddd, dd MMMM aaaa hh:mm:ss tt', 'th-th') 'th-th', FORMAT(@date, 'dddd, dd MMMM aaaa hh:mm:ss tt', 'nl-nl') 'nl-nl', FORMAT (@date, 'dddd, dd MMMM aaaa hh:mm:ss tt', 'ne-np') 'ne-np', FORMAT(@date, 'dddd, dd MMMM aaaa hh:mm:ss tt', ' fa-ir') 'fa-ir';

Resultados (usando saída vertical):
pt-br | sábado, 15 de junho de 2019 01:45:30 Men-gb | sábado, 15 de junho de 2019 13h45:30 | domingo, 15 de agosto 2562 01:45:30 PMnl-nl | sexta-feira, 15 de junho de 2019 01:45:30 ne-np | domingo, 15 de agosto de 2019 01:45:30 अपराह्नfa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ

Provavelmente, a observação mais óbvia é que o resultado é formatado usando o idioma da localidade especificada. Mas se olharmos de perto, podemos ver que ele também ignora o designador AM/PM (tt ) para o nl-nl cultura, provavelmente porque essa cultura normalmente usa o relógio de 24 horas. Também podemos ver que mesmo nosso posicionamento pode ser ignorado em alguns casos (por exemplo, fa-ir ).

No entanto, nem tudo é ignorado e, portanto, acabamos com uma combinação de nossas especificações explícitas e aquelas determinadas pela localidade.

Encontrar/alterar seu idioma atual


Conforme mencionado, se você não fornecer o argumento “cultura”, o idioma da sua sessão atual será usado para determinar a localidade.

Existem várias maneiras de encontrar o idioma da sua sessão atual.

Você também pode alterar a localidade de sua conexão atual.

Alternativamente, você pode simplesmente usar o SET LANGUAGE instrução para alternar o idioma atual conforme necessário.

Aqui está um exemplo rápido usando SET LANGUAGE para mostrar que suas próprias configurações de idioma podem afetar os resultados da formatação da mesma forma que quando você usa o argumento “cultura”, como nos exemplos anteriores.
DECLARE @num decimal(3,2) =-1.23;SET LANGUAGE Britânico;SELECT FORMAT(@num, 'C') Resultado;SET LANGUAGE US_English;SELECT FORMAT(@num, 'C') Resultado; 
Resultados:
+----------+| Resultado ||----------|| -£1,23 |+----------++----------+| Resultado ||----------|| ($1,23) |+----------+