Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment spécifier la culture invariante lors de l'utilisation de FORMAT() dans SQL Server

Dans SQL Server, vous pouvez utiliser le FORMAT() pour formater les valeurs de date/heure et de nombre sous forme de chaînes. En particulier, la fonction fournit un formatage "conscient des paramètres régionaux" et la fonction accepte un argument "culture", qui vous permet de spécifier une culture ou une langue à utiliser pour le format réel. Par exemple, vous pouvez passer en-us pour s'assurer que les résultats sont formatés au format anglais américain.

L'argument culture est facultatif, donc si vous ne le fournissez pas, la sortie sera déterminée par la langue de la session en cours.

Le FORMAT() accepte toute culture prise en charge par le .NET Framework comme argument (vous n'êtes pas limité aux langages explicitement pris en charge par SQL Server).

L'une des cultures prises en charge par le .NET Framework est la culture invariante. La culture invariante est insensible à la culture. Plus précisément, cette culture est associée à la langue anglaise mais pas à un pays/une région.

Pour spécifier que FORMAT() doit afficher les résultats en utilisant la culture invariante, utilisez simplement "iv" pour l'argument culture (le troisième argument).

Exemple 1 – Devise

Voici un exemple de formatage d'une valeur en tant que devise à l'aide de la culture invariante.

SELECT FORMAT(123, 'C', 'iv') Result;

Résultats :

+----------+
| Result   |
|----------|
| ¤123.00  |
+----------+

Il en résulte que la sortie a une partie fractionnaire avec une décimale. Il est également précédé du signe de devise (¤), qui est utilisé pour désigner une devise non spécifiée (il s'agit du caractère Unicode U + 00A4).

Exemple 2 – Date

Voici un exemple de formatage d'une date en utilisant la culture invariante avec un format de date court.

DECLARE @date date = '2030-05-25';
SELECT FORMAT(@date, 'd', 'iv') Result;

Résultats :

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

Le format de date court pour la culture invariante est MM/jj/aaaa.

Le voici à nouveau, mais cette fois je le compare aux cultures anglaise américaine, britannique et allemande (Deutsch).

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)';

Résultats :

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

Exemple 3 - Tous les formats de date et d'heure standard

En voici un autre utilisant la culture invariante, mais cette fois je formate un datetimeoffset value en utilisant toutes les chaînes de format de date et d'heure standard prises en charge par le .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';

Résultat (en utilisant la sortie verticale) :

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

La culture invariante ne fonctionne pas sur votre système ?

Si vous ne parvenez pas à faire fonctionner la culture invariante sur votre système, cela peut être dû à l'installation d'une ancienne version du .NET Framework. La documentation de .NET Framework 4.8 indique explicitement que la culture invariante est disponible à l'aide de son code à deux lettres ISO 639-1 "iv" .

Cependant, sur cette question Stack Overflow, la réponse de Solomon Rutzky suggère que cela n'était peut-être disponible qu'à partir de .NET 4.5.

Si vous ne parvenez pas à le faire fonctionner avec une version antérieure de .NET, essayez de mettre à niveau vers la dernière version (ou une version d'au moins 4.5).