यह भूलना आसान हो सकता है कि T-SQL FORMAT()
फ़ंक्शन स्थानीय-जागरूक स्वरूपण प्रदान करता है। लोकेल-अवेयर का अर्थ है कि लोकेल परिणामों को प्रभावित कर सकता है। दूसरे शब्दों में, आपको प्राप्त होने वाला सटीक आउटपुट लोकेल पर निर्भर करेगा।
डिफ़ॉल्ट रूप से, फ़ंक्शन लोकेल निर्धारित करने के लिए वर्तमान सत्र की भाषा का उपयोग करता है। हालांकि, फ़ंक्शन के लिए "संस्कृति" तर्क पारित करके इसे ओवरराइड किया जा सकता है। ऐसा करने से आप वर्तमान सत्र की भाषा को बदले बिना किसी विशेष स्थान के लिए परिणाम प्रदान कर सकते हैं।
इस आलेख में उदाहरण हैं कि FORMAT()
. का उपयोग करते समय लोकेल परिणामों को कैसे प्रभावित कर सकता है SQL सर्वर में कार्य करता है।
उदाहरण 1 - मुद्राएं
संख्याओं को फ़ॉर्मेट करते समय भाषा/संस्कृति आपके परिणामों को कैसे प्रभावित कर सकती है, यह दिखाने के लिए यहां एक त्वरित उदाहरण दिया गया है।
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';
परिणाम:
+-----------+-----------+-----------+------------+------------+--------------+ | en-us | en-gb | th-th | nl-nl | ne-np | fa-ir | |-----------+-----------+-----------+------------+------------+--------------| | $1,234.56 | £1,234.56 | ฿1,234.56 | € 1.234,56 | रु 1,234.56 | 1,234/56ريال | +-----------+-----------+-----------+------------+------------+--------------+
C
इस उदाहरण में एक मानक संख्यात्मक प्रारूप विनिर्देशक है। यह एकल वर्ण निर्दिष्ट करता है कि मान को एक निश्चित तरीके से स्वरूपित किया जाना चाहिए (इस मामले में, मुद्रा के रूप में)। सौभाग्य से, SQL सर्वर यह जानने के लिए पर्याप्त स्मार्ट है कि सभी संस्कृतियां एक ही प्रारूप का उपयोग नहीं करती हैं, और यह स्वचालित रूप से संस्कृति के आधार पर एक अलग प्रारूप प्रस्तुत करती है।
उपरोक्त उदाहरण में, हर बार जब मैं FORMAT()
. पर कॉल करता हूं , मैं एक ही मान और प्रारूप स्ट्रिंग पास करता हूं। एकमात्र अंतर संस्कृति तर्क के मूल्य का है। यह उपयोग की जा रही संस्कृति के आधार पर परिणाम भिन्न होने का कारण बनता है। मुद्रा प्रतीक और उसकी स्थिति संस्कृति द्वारा निर्धारित की जाती है। दशमलव विभाजकों और समूह विभाजकों के लिए प्रयुक्त वर्ण भी संस्कृति द्वारा निर्धारित किया जाता है।
उदाहरण 2 - नकारात्मक मान
स्वरूपण इस बात पर भी निर्भर कर सकता है कि मान सकारात्मक है या नकारात्मक। यदि हम ऋणात्मक मान का उपयोग करते हैं, तो यहां क्या होता है:
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';
परिणाम:
+---------+---------+---------+---------+---------+-----------+ | en-us | en-gb | th-th | 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; 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';
परिणाम:
+---------+---------+---------+---------+---------+---------+ | en-us | en-gb | th-th | 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'; 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';
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
en-us | 6/15/2019 1:45:30 PM en-gb | 15/06/2019 13:45:30 th-th | 15/6/2562 13:45:30 nl-nl | 15-6-2019 13:45:30 ne-np | 6/15/2019 1:45:30 अपराह्न fa-ir | 25/03/1398 01:45:30 ب.ظ
यह उदाहरण एक सामान्य दिनांक/लंबे समय प्रारूप का उपयोग करता है (G
. का उपयोग करके प्राप्त किया गया) - मानक दिनांक और समय प्रारूप विनिर्देशों में से एक), और संस्कृतियों के बीच अंतर स्पष्ट है।
लेकिन हम लंबे दिनांक प्रारूप का उपयोग करते हुए भी अंतर देख सकते हैं:
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';
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
en-us | Saturday, June 15, 2019 1:45:30 PM en-gb | 15 June 2019 13:45:30 th-th | 15 มิถุนายน 2562 13:45:30 nl-nl | zaterdag 15 juni 2019 13:45:30 ne-np | शनिवार, जून 15, 2019 1:45:30 अपराह्न fa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ
उदाहरण 4 - कस्टम फ़ॉर्मेट स्ट्रिंग्स के बारे में क्या?
पिछले उदाहरण मानक प्रारूप स्ट्रिंग का उपयोग करते हैं, जो आपके लिए स्वरूपण को काफी हद तक करते हैं। यह एक कस्टम प्रारूप स्ट्रिंग निर्दिष्ट करने का एक शॉर्टहैंड तरीका है। दूसरी ओर एक कस्टम प्रारूप विनिर्देशक, आपको यह निर्दिष्ट करने की अनुमति देता है कि आउटपुट में कौन से वर्ण दिखाई देते हैं, और वे कहाँ जाते हैं। हालांकि, इसका आमतौर पर मतलब है कि आपको अपनी प्रारूप स्ट्रिंग में अधिक प्रारूप विनिर्देशकों का उपयोग करने की आवश्यकता है।
लेकिन जब आप कस्टम प्रारूप विनिर्देशक का उपयोग करते हैं, तब भी सटीक आउटपुट लोकेल पर भी निर्भर हो सकता है। यदि हम पिछले उदाहरण की नकल करने के लिए एक कस्टम दिनांक और समय प्रारूप स्ट्रिंग का उपयोग करना चाहते हैं, तो हम कुछ ऐसा कर सकते हैं:
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 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';
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
en-us | Saturday, 15 June 2019 01:45:30 PM en-gb | Saturday, 15 June 2019 01:45:30 PM th-th | เสาร์, 15 มิถุนายน 2562 01:45:30 PM nl-nl | zaterdag, 15 juni 2019 01:45:30 ne-np | शनिवार, 15 जून 2019 01:45:30 अपराह्न fa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ
संभवतः सबसे स्पष्ट अवलोकन यह है कि परिणाम निर्दिष्ट स्थान की भाषा का उपयोग करके स्वरूपित किया जाता है। लेकिन अगर हम बारीकी से देखें, तो हम देख सकते हैं कि यह एएम/पीएम डिज़ाइनर (tt
) की भी उपेक्षा करता है। ) nl-nl
. के लिए संस्कृति, शायद इसलिए कि वह संस्कृति आमतौर पर 24 घंटे की घड़ी का उपयोग करती है। हम यह भी देख सकते हैं कि कुछ मामलों में हमारी स्थिति को भी नज़रअंदाज़ किया जा सकता है (जैसे fa-ir
)
हालांकि, हर चीज़ को नज़रअंदाज़ नहीं किया जाता है और इसलिए हम अपने स्पष्ट विनिर्देशों और स्थान द्वारा निर्धारित विशिष्टताओं के संयोजन के साथ समाप्त होते हैं।
अपनी वर्तमान भाषा को खोजना/बदलना
जैसा कि उल्लेख किया गया है, यदि आप "संस्कृति" तर्क प्रदान नहीं करते हैं, तो आपके वर्तमान सत्र की भाषा का उपयोग स्थान निर्धारित करने के लिए किया जाएगा।
आपके वर्तमान सत्र की भाषा खोजने के कई तरीके हैं।
आप अपने वर्तमान कनेक्शन का स्थान भी बदल सकते हैं।
वैकल्पिक रूप से, आप केवल SET LANGUAGE
. का उपयोग कर सकते हैं वर्तमान भाषा को आवश्यकतानुसार बदलने के लिए कथन।
यहां SET LANGUAGE
का उपयोग करके एक त्वरित उदाहरण दिया गया है यह दिखाने के लिए कि आपकी स्वयं की भाषा सेटिंग, फ़ॉर्मेटिंग परिणामों को ठीक उसी तरह प्रभावित कर सकती है, जैसे पिछले उदाहरणों की तरह जब आप "संस्कृति" तर्क का उपयोग करते हैं।
DECLARE @num decimal(3,2) = -1.23; SET LANGUAGE British; SELECT FORMAT(@num, 'C') Result; SET LANGUAGE US_English; SELECT FORMAT(@num, 'C') Result;
परिणाम:
+----------+ | Result | |----------| | -£1.23 | +----------+ +----------+ | Result | |----------| | ($1.23) | +----------+