Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как езиковите настройки могат да повлияят на вашите FORMAT() резултати в SQL Server (T-SQL примери)

Може лесно да забравите, че T-SQL FORMAT() функцията осигурява форматиране, съобразено с локал. Locale-aware означава, че локалът може да повлияе на резултатите. С други думи, точният изход, който ще получите, ще зависи от локала.

По подразбиране функцията използва езика на текущата сесия, за да определи локала. Това обаче може да бъде отменено чрез предаване на аргумент „култура“ на функцията. Това ви позволява да предоставите резултати за конкретен локал, без да се налага да променяте езика на текущата сесия.

Тази статия съдържа примери за това как локалът може да повлияе на резултатите при използване на FORMAT() функция в SQL Server.

Пример 1 – Валути

Ето един бърз пример, за да демонстрирате как езикът/културата може да повлияе на резултатите ви при форматиране на числа.

DECLARE @num decimal(6,2) =1234.56;ИЗБЕРЕТЕ ФОРМАТ(@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';

Резултати:

+-----------+-----------+-----------+---------- --+-----------+--------------+| en-us | en-gb | ти-ти | nl-nl | ne-np | fa-ir ||-----------+-----------+-----------+--------- ---+-----------+--------------|| $1,234.56 | £1,234.56 | 1234,56 ฿ | 1 234,56 € | रु 1234,56 | 1,234/56ريال |+-----------+-----------+-----------+--------- ---+-----------+--------------+

C в този пример е стандартен спецификатор на числов формат. Този единичен знак указва, че стойността трябва да бъде форматирана по определен начин (в този случай като валута). За щастие SQL Server е достатъчно умен, за да знае, че не всички култури използват един и същ формат и автоматично представя различен формат в зависимост от културата.

В горния пример всеки път, когато извикам FORMAT() , предавам същата стойност и форматен низ. Единствената разлика е стойността на аргумента за култура. Това води до различни резултати в зависимост от използваната култура. Символът на валутата и неговото позициониране се определят от културата. Знакът, използван за десетични разделители и разделители на групи, също се определя от културата.

Пример 2 – Отрицателни стойности

Форматирането може също да зависи от това дали стойността е положителна или отрицателна. Ако използваме отрицателна стойност, ето какво се случва:

DECLARE @num decimal(3,2) =-1.23;ИЗБЕРЕТЕ ФОРМАТ(@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';

Резултати:

+--------+--------+--------+--------+------ ---+----------+| en-us | en-gb | ти-ти | nl-nl | ne-np | fa-ir ||--------+--------+--------+--------+----- ----+-----------|| ($1,23) | -£1,23 | -฿1,23 | € -1,23 | -रु 1,23 | 1/23-Риал |+--------+--------+--------+--------+--- ------+-----------+

В някои култури знакът минус се появява преди знака за валута, в други се появява след него. Но в други култури изобщо няма знак минус – той е заменен със скоби, които обграждат целия резултат, включително знака за валута.

Въпреки това, не трябва да приемаме, че едни и същи правила се прилагат към всички форматни низове. Например, ако го форматираме като число вместо валута, няма да получим никакви скоби:

DECLARE @num decimal(3,2) =-1,23;ИЗБЕРЕТЕ ФОРМАТ(@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';

Резултати:

+--------+--------+--------+--------+------ ---+--------+| en-us | en-gb | ти-ти | nl-nl | ne-np | fa-ir ||--------+--------+--------+--------+----- ----+--------|| -1,23 | -1,23 | -1,23 | -1,23 | -1,23 | 1/23- |+---------+--------+--------+--------+---- -----+--------+

Пример 3 – Дати и часове

Форматирането на числата не е единственото нещо, което се влияе от културата. Датите и часовете например също ще бъдат форматирани по различен начин в зависимост от културата.

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';ИЗБЕРЕТЕ ФОРМАТ(@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';

Резултати (с помощта на вертикален изход):

bg-us | 15.06.2019 13:45:30 Men-gb | 15.06.2019 г. 13:45:30 | 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 13:45:30 ب.ظ

Този пример използва общ формат за дата/дълго време (постига се с помощта на G – един от стандартните спецификатори на формата за дата и час), и разликите между културите са очевидни.

Но също така можем да видим разлики дори когато използваме дълъг формат на датата:

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';ИЗБЕРЕТЕ ФОРМАТ(@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';

Резултати (с помощта на вертикален изход):

bg-us | Събота, 15 юни 2019 г., 13:45:30 ч. Men-gb | 15 юни 2019 г. 13:45:30 | 15 มิถุนายน 2562 13:45:30nl-nl | вчера 15 юни 2019 13:45:30ne-np | शनिवार, 15 март 2019 г. 1:45:30 अपराह्नfa-ir | 25 март 1398 г. 13:45:30 ч. 25 ч. 25 ч. 30 мин.

Пример 4 – Какво ще кажете за низовете с персонализиран формат?

Предишните примери използват стандартни форматни низове, които до голяма степен правят форматирането вместо вас. Това е като съкратен начин за определяне на персонализиран форматен низ. Спецификаторът на персонализиран формат, от друга страна, ви позволява да посочите точно какви символи се появяват в изхода и къде отиват. Това обаче обикновено означава, че трябва да използвате повече спецификатори на формат във вашия форматен низ.

Но дори когато използвате персонализирани спецификатори на формат, точният изход може също да зависи от локала. Ако искаме да използваме персонализиран низ за формат на дата и час, за да имитираме предишния пример, може да направим нещо подобно:

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';ИЗБЕРЕТЕ ФОРМАТ(@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 yyyy 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 yyyy hh:mm:ss tt', 'ne-np') 'ne-np', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', ' fa-ir') 'fa-ir';

Резултати (с помощта на вертикален изход):

bg-us | Събота, 15 юни 2019 г., 13:45:30 ч. Men-gb | Събота, 15 юни 2019 г., 13:45:30 ч. | เสาร์, 15 มิถุนายน 2562 13:45:30 PMnl-nl | вчера, 15 юни 2019 01:45:30 ne-np | март, 15 март 2019 г. 01:45:30 परा्नfa-ir | 25 март 1398 г. 13:45:30 ч. 25 ч. 25 ч. 30 мин.

Вероятно най-очевидното наблюдение е, че резултатът е форматиран с помощта на езика на посочения локал. Но ако се вгледаме внимателно, можем да видим, че той също игнорира обозначението AM/PM (tt ) за nl-nl култура, вероятно защото тази култура обикновено използва 24-часовия часовник. Можем също да видим, че дори нашето позициониране може да бъде игнорирано в някои случаи (напр. fa-ir ).

Въпреки това, не всичко се игнорира и в крайна сметка получаваме комбинация от нашите изрични спецификации и тези, определени от локала.

Намиране/промяна на текущия ви език

Както споменахме, ако не предоставите аргумента „култура“, езикът на текущата ви сесия ще се използва за определяне на локала.

Има няколко начина да намерите езика на текущата си сесия.

Можете също да промените локала на текущата си връзка.

Като алтернатива можете просто да използвате SET LANGUAGE изявление за превключване на текущия език според изискванията.

Ето един бърз пример за използване на SET LANGUAGE за да покажете, че вашите собствени езикови настройки могат да повлияят на резултатите от форматирането по същия начин, както когато използвате аргумента „култура“, както в предишните примери.

DECLARE @num decimal(3,2) =-1.23;ЗАДАДЕТЕ ЕЗИК британски;ИЗБЕРЕТЕ ФОРМАТ(@num, 'C') Резултат;ЗАДАДЕТЕ ЕЗИК US_английски;ИЗБЕРЕТЕ ФОРМАТ(@num, 'C') Резултат; 

Резултати:

+---------+| Резултат ||----------|| -£1,23 |+----------++----------+| Резултат ||----------|| ($1,23) |+---------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прегледайте настройките на вашата сесия с SESSIONPROPERTY() в SQL Server

  2. Вземете текущата часова зона на сървъра в SQL Server (T-SQL)

  3. Поддръжката на SQL Server 2008 приключва. Сега какво?

  4. Внимание на потребителите, работещи с SQL Server 2008 и SQL Server 2008 R2

  5. Какъв е най-добрият начин за показване на изображение от база данни на sql сървър в asp.net?