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

Comment les paramètres de langue peuvent affecter vos résultats FORMAT() dans SQL Server (exemples T-SQL)

Il peut être facile d'oublier que le T-SQL FORMAT() La fonction fournit un formatage compatible avec les paramètres régionaux. Conscient des paramètres régionaux signifie que les paramètres régionaux peuvent affecter les résultats. En d'autres termes, la sortie exacte que vous obtiendrez dépendra des paramètres régionaux.

Par défaut, la fonction utilise la langue de la session en cours pour déterminer les paramètres régionaux. Cependant, cela peut être remplacé en passant un argument « culture » à la fonction. Cela vous permet de fournir des résultats pour un paramètre régional particulier sans avoir à changer la langue de la session en cours.

Cet article contient des exemples de la façon dont les paramètres régionaux peuvent affecter les résultats lors de l'utilisation de FORMAT() fonction dans SQL Server.

Exemple 1 – Devises

Voici un exemple rapide pour démontrer comment la langue/culture peut affecter vos résultats lors du formatage des nombres.

DECLARE @num decimal(6,2) =1234.56;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en-gb ') 'en-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';

Résultats :

+-----------+-----------+-----------+---------- --+------------+--------------+| en-us | fr-fr | ème-ème | nl-nl | ne-np | fa-ir ||-----------+-----------+-----------+--------- ---+------------+--------------|| 1 234,56 $ | 1 234,56 £ | 1 234,56 ฿ | 1.234,56 € | 1 234,56 $ | 1,234/56ريال |+-----------+-----------+-----------+--------- ---+------------+-------------+

Le C dans cet exemple est un spécificateur de format numérique standard. Ce caractère unique spécifie que la valeur doit être formatée d'une certaine manière (dans ce cas, en tant que devise). Heureusement, SQL Server est assez intelligent pour savoir que toutes les cultures n'utilisent pas le même format, et il présente automatiquement un format différent selon la culture.

Dans l'exemple ci-dessus, chaque fois que j'appelle FORMAT() , je passe la même valeur et la même chaîne de format. La seule différence est la valeur de l'argument de la culture. Les résultats sont donc différents selon la culture utilisée. Le symbole monétaire et son positionnement sont déterminés par la culture. Le caractère utilisé pour les séparateurs décimaux et les séparateurs de groupes est également déterminé par la culture.

Exemple 2 – Valeurs négatives

Le formatage peut également dépendre du fait que la valeur est positive ou négative. Si nous utilisons une valeur négative, voici ce qui se passe :

DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en- gb') 'en-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';

Résultats :

+---------+---------+---------+---------+------ ---+-----------+| en-us | fr-fr | ème-ème | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+-----------|| (1,23 $) | -1,23 £ | -1,23 ฿ | -1,23 € | -À partir de 1.23 | 1/23-ريال |+---------+---------+---------+---------+--- ------+-----------+

Dans certaines cultures, le signe moins apparaît avant le signe monétaire, dans d'autres, il apparaît après. Mais dans d'autres cultures, il n'y a pas du tout de signe moins - il est remplacé par des parenthèses qui entourent tout le résultat, y compris le signe monétaire.

Cependant, nous ne devons pas supposer que les mêmes règles sont appliquées à toutes les chaînes de format. Par exemple, si nous le formatons comme un nombre au lieu d'une devise, nous n'obtenons pas de parenthèses :

DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'N', 'en-us') 'en-us', FORMAT(@num, 'N', 'en- gb') 'en-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';

Résultats :

+---------+---------+---------+---------+------ ---+---------+| en-us | fr-fr | ème-ème | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+---------|| -1.23 | -1.23 | -1.23 | -1,23 | -1.23 | 1/23- |+---------+---------+---------+---------+---- -----+---------+

Exemple 3 – Dates et heures

Le formatage des nombres n'est pas la seule chose qui est affectée par la culture. Les dates et les heures, par exemple, seront également formatées différemment selon la culture.

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'G', 'en-us') 'en-us', FORMAT(@date , 'G', 'en-gb') 'en-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';

Résultats (en utilisant la sortie verticale) :

fr-fr | 15/06/2019 13:45:30Men-fr | 15/06/2019 13:45:30-ème | 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 ب.ظ

Cet exemple utilise un format général de date/heure longue (obtenu en utilisant G - l'un des spécificateurs de format de date et d'heure standard), et les différences entre les cultures sont évidentes.

Mais nous pouvons également voir des différences même en utilisant un format de date long :

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'F', 'en-us') 'en-us', FORMAT(@date , 'F', 'en-gb') 'en-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';

Résultats (en utilisant la sortie verticale) :

fr-fr | Samedi 15 juin 2019 13:45:30Men-gb | 15 juin 2019 13:45:30 | 15 mai 2562 13:45:30nl-nl | samedi 15 juin 2019 13:45:30ne-np | 15 juin 2019 1:45:30 شنبه, 25 خرداد 1398 01:45:30 ب.ظ

Exemple 4 :Qu'en est-il des chaînes de format personnalisées ?

Les exemples précédents utilisent des chaînes de format standard, qui font à peu près le formatage pour vous. C'est comme un raccourci pour spécifier une chaîne de format personnalisée. Un spécificateur de format personnalisé, d'autre part, vous permet de spécifier exactement quels caractères apparaissent dans la sortie et où ils vont. Cependant, cela signifie généralement que vous devez utiliser davantage de spécificateurs de format dans votre chaîne de format.

Mais même lorsque vous utilisez des spécificateurs de format personnalisés, la sortie exacte peut également dépendre des paramètres régionaux. Si nous voulions utiliser une chaîne de format de date et d'heure personnalisée pour imiter l'exemple précédent, nous pourrions faire quelque chose comme ceci :

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-us') 'en-us', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-gb') 'en-gb', FORMAT(@date, 'dddd, dd MMMM aaaa hh :mm:ss tt', 'th-th') 'th-th', FORMAT(@date, 'dddd, dd MMMM yyyy 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';

Résultats (en utilisant la sortie verticale) :

fr-fr | samedi 15 juin 2019 13:45:30men-fr | Samedi 15 juin 2019 13:45:30th-th | mercredi, 15 juillet 2562 01:45:30 PMnl-nl | samedi 15 juin 2019 01:45:30 ne-np | Mercredi, 15 juillet 2019 01:45:30 شنبه, 25 خرداد 1398 01:45:30 ب.ظ

L'observation la plus évidente est probablement que le résultat est formaté en utilisant la langue de la locale spécifiée. Mais si nous regardons attentivement, nous pouvons voir qu'il ignore également l'indicateur AM/PM (tt ) pour le nl-nl culture, probablement parce que cette culture utilise généralement l'horloge de 24 heures. Nous pouvons également voir que même notre positionnement peut être ignoré dans certains cas (par exemple, fa-ir ).

Cependant, tout n'est pas ignoré et nous nous retrouvons donc avec une combinaison de nos spécifications explicites et de celles déterminées par les paramètres régionaux.

Rechercher/changer votre langue actuelle

Comme mentionné, si vous ne fournissez pas l'argument "culture", la langue de votre session actuelle sera utilisée pour déterminer les paramètres régionaux.

Il existe plusieurs façons de trouver la langue de votre session en cours.

Vous pouvez également modifier les paramètres régionaux de votre connexion actuelle.

Alternativement, vous pouvez simplement utiliser le SET LANGUAGE déclaration pour changer la langue actuelle selon les besoins.

Voici un exemple rapide utilisant SET LANGUAGE pour montrer que vos propres paramètres de langue peuvent affecter les résultats de formatage de la même manière que lorsque vous utilisez l'argument "culture", comme dans les exemples précédents.

DECLARE @num decimal(3,2) =-1.23;SET LANGUAGE British;SELECT FORMAT(@num, 'C') Result;SET LANGUAGE US_English;SELECT FORMAT(@num, 'C') Result; 

Résultats :

+----------+| Résultat ||----------|| -£1.23 |+----------++----------+| Résultat ||----------|| (1,23 $) |+----------+