Může být snadné zapomenout, že T-SQL FORMAT()
Funkce poskytuje formátování s ohledem na národní prostředí. Locale-aware znamená, že locale může ovlivnit výsledky. Jinými slovy, přesný výstup, který získáte, bude záviset na národním prostředí.
Ve výchozím nastavení používá funkce k určení národního prostředí jazyk aktuální relace. To však lze potlačit předáním argumentu „kultura“ funkci. To vám umožní poskytovat výsledky pro konkrétní národní prostředí, aniž byste museli měnit jazyk aktuální relace.
Tento článek obsahuje příklady toho, jak může národní prostředí ovlivnit výsledky při použití FORMAT()
funkce na serveru SQL.
Příklad 1 – Měny
Zde je rychlý příklad, který ukazuje, jak může jazyk/kultura ovlivnit vaše výsledky při formátování čísel.
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';
Výsledky:
+-----------+-----------+-----------+---------- --+------------+--------------+| en-us | en-gb | tý-tý | nl-nl | ne-np | fa-ir ||-----------+-----------+-----------+---------- ---+------------+--------------|| 1 234,56 $ | 1 234,56 GBP | 1 234,56 ฿ | 1 234,56 € | रु 1 234,56 | 1 234/56 ريال |+-----------+-----------+-----------+---------- ---+------------+--------------+
C
v tomto příkladu je standardní číselný specifikátor formátu. Tento jediný znak určuje, že hodnota by měla být naformátována určitým způsobem (v tomto případě jako měna). Naštěstí je SQL Server dostatečně chytrý na to, aby věděl, že ne všechny kultury používají stejný formát a automaticky prezentuje jiný formát v závislosti na kultuře.
Ve výše uvedeném příkladu pokaždé, když zavolám FORMAT()
, předám stejnou hodnotu a formátovací řetězec. Jediný rozdíl je v hodnotě argumentu kultury. To způsobí, že se výsledky budou lišit v závislosti na použité kultuře. Symbol měny a jeho umístění je určeno kulturou. Znak používaný pro oddělovače desetinných míst a oddělovače skupin je také určen kulturou.
Příklad 2 – Záporné hodnoty
Formátování může také záviset na tom, zda je hodnota kladná nebo záporná. Pokud použijeme zápornou hodnotu, stane se toto:
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';
Výsledky:
+---------+---------+---------+---------+------ ---+------------+| en-us | en-gb | tý-tý | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+------------|| (1,23 USD) | -1,23 GBP | -1,23 ฿ | € -1,23 | -रु 1,23 | 1/23-ريال |+---------+---------+----------+---------+--- ------+-----------+
V některých kulturách se znaménko minus objevuje před znakem měny, v jiných se objevuje za ním. Ale v jiných kulturách vůbec žádné znaménko mínus neexistuje – je nahrazeno závorkami, které obklopují celý výsledek, včetně znaménka měny.
Neměli bychom však předpokládat, že pro všechny formátovací řetězce platí stejná pravidla. Pokud jej například naformátujeme jako číslo místo měny, nezískáme žádné závorky:
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';
Výsledky:
+---------+---------+---------+---------+------ ---+---------+| en-us | en-gb | tý-tý | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+----------|| -1,23 | -1,23 | -1,23 | -1,23 | -1,23 | 1/23- |+---------+---------+---------+---------+---- -----+---------+
Příklad 3 – Data a časy
Formátování čísel není jediná věc, kterou kultura ovlivňuje. Například data a časy budou také formátovány odlišně v závislosti na kultuře.
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(@datum, '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';
Výsledky (pomocí vertikálního výstupu):
en-us | 15.6.2019 13:45:30 Men-cz | 15. 6. 2019 13:45:30 | 6. 15. 2562 13:45:30 nl-nl | 15-6-2019 13:45:30ne-np | 15. 6. 2019 1:45:30 अपराह्नfa-ir | 25/03/1398 01:45:30 ب.ظ
Tento příklad používá obecný formát data/dlouhého času (dosaženého pomocí G
– jeden ze standardních specifikátorů formátu data a času) a rozdíly mezi kulturami jsou zřejmé.
Ale můžeme také vidět rozdíly i při použití formátu dlouhého data:
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(@datum, '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';
Výsledky (pomocí vertikálního výstupu):
en-us | Sobota, 15. června 2019 13:45:30 PMen-cz | 15. června 2019 13:45:30 | 15 มิถุนายน 2562 13:45:30 nl-nl | zaterdag 15. června 2019 13:45:30ne-np | शनिवार, जून 15, 2019 1:45:30 अपराह्नfa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ
Příklad 4 – A co řetězce vlastního formátu?
Předchozí příklady používají standardní formátovací řetězce, které do značné míry provádějí formátování za vás. Je to jako zkrácený způsob zadání vlastního formátovacího řetězce. Vlastní specifikátor formátu na druhé straně umožňuje přesně určit, jaké znaky se objeví ve výstupu a kam jdou. To však obvykle znamená, že musíte ve formátovacím řetězci použít více specifikátorů formátu.
Ale i když použijete vlastní specifikátory formátu, přesný výstup může záviset také na národním prostředí. Pokud bychom chtěli použít vlastní řetězec formátu data a času k napodobení předchozího příkladu, mohli bychom udělat něco takového:
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 rrrr hh:mm:ss tt', 'th-th') 'th-th', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'nl-nl') 'nl-nl', FORMAT (@datum, 'dddd, dd MMMM rrrr hh:mm:ss tt', 'ne-np') 'ne-np', FORMAT(@date, 'dddd, dd MMMM rrrr hh:mm:ss tt', ' fa-ir') 'fa-ir';
Výsledky (pomocí vertikálního výstupu):
en-us | Sobota, 15. června 2019 13:45:30 PM-cz | Sobota, 15. června 2019 13:45:30 | เสาร์, 15 มิถุนายน 2562 13:45:30 PMnl-nl | zaterdag, 15. června 2019 01:45:30 ne-np | शनिवार, 15. listopad 2019 01:45:30 अपराह्नfa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ
Pravděpodobně nejviditelnějším pozorováním je, že výsledek je formátován pomocí jazyka zadaného národního prostředí. Ale když se podíváme pozorně, uvidíme, že také ignoruje označení AM/PM (tt
) pro nl-nl
kultura, pravděpodobně proto, že tato kultura obvykle používá 24hodinové hodiny. Můžeme také vidět, že i naše umístění může být v některých případech ignorováno (např. fa-ir
).
Ne všechno je však ignorováno, a tak skončíme u kombinace našich explicitních specifikací a specifikací určených místním prostředím.
Vyhledání/změna aktuálního jazyka
Jak již bylo zmíněno, pokud neuvedete argument „kultura“, k určení národního prostředí se použije jazyk vaší aktuální relace.
Existuje několik způsobů, jak zjistit jazyk vaší aktuální relace.
Můžete také změnit národní prostředí vašeho aktuálního připojení.
Případně můžete jednoduše použít SET LANGUAGE
příkazem přepnout aktuální jazyk podle potřeby.
Zde je rychlý příklad použití SET LANGUAGE
ukázat, že vaše vlastní jazykové nastavení může ovlivnit výsledky formátování stejně, jako když použijete argument „kultura“, jako v předchozích příkladech.
DECLARE @num decimal(3,2) =-1,23;SET LANGUAGE British;SELECT FORMAT(@num, 'C') Výsledek;SET LANGUAGE US_English;SELECT FORMAT(@num, 'C') Výsledek;Výsledky:
+-----------+| Výsledek ||-----------|| -1,23 GBP |+----------++----------+| Výsledek ||-----------|| (1,23 USD) |+----------+