पृथ्वी पर संस्कृतियों की विविधता के लिए धन्यवाद, हमारे पास विभिन्न प्रकार के दिनांक प्रारूप हैं। संख्यात्मक तिथियों के लिए, हमारे पास महीने-दिन-वर्ष, दिन-महीने-वर्ष और वर्ष-महीने-दिन हैं। हमारे पास छोटे और लंबे प्रारूप भी हैं। तिथियों को समय के साथ मिलाया जा सकता है, जो एक और कहानी है। यह वास्तविकता काम पर हमारा पीछा करती है। इसलिए SQL दिनांक स्वरूप ऐसा कुछ नहीं है जिसे हम आसानी से ले सकें।
फ़िलिपींस में, हम 2 स्वरूपों का उपयोग करते हैं:माह-दिन-वर्ष और दिन-महीना-वर्ष। संख्यात्मक तिथियों के लिए माह-दिन-वर्ष सामान्य प्रारूप है। लेकिन लंबे दिनांक स्वरूपों के साथ, हम दिन-महीने-वर्ष और महीने-दिन-वर्ष का परस्पर उपयोग करते हैं।
काम पर, मैंने कभी भी महीने-दिन-वर्ष के अलावा SQL सर्वर दिनांक प्रारूप सेटिंग का सामना नहीं किया। हालांकि, यह डेटा एक्सचेंज और एक्सट्रैक्ट-ट्रांसफॉर्म-लोड (ईटीएल) प्रोजेक्ट के लिए रिपोर्ट और फाइलों में भिन्न होता है। व्यक्तिगत प्राथमिकताओं के लिए अपने स्टेशनों में इसे बदलने वाले उपयोगकर्ताओं को अकेला छोड़ दें! इन सभी परिदृश्यों के साथ, उनसे उचित तरीके से निपटना नहीं तोड़ने का एक नुस्खा है।
क्या आपके ऐप्स विभिन्न संस्कृतियों से संबंधित हैं? इन विभिन्न SQL दिनांक स्वरूपों के साथ काम करते समय यह जटिलता का एक और स्तर और एक समस्या है। इस लेख में, हम इन सभी किस्मों और उदाहरणों से निपटने के लिए मानक का पता लगाएंगे। अंत तक पढ़ें! लेकिन इससे पहले कि हम आगे बढ़ें, आइए इस बारे में एक संक्षिप्त जानकारी लें कि SQL सर्वर तारीखों को कैसे संग्रहीत करता है।
SQL सर्वर दिनांक कैसे संग्रहीत करता है
अनुमान तो लगाओ। क्या SQL सर्वर डेटाबेस में 03/29/2021 21:35 स्टोर करता है? 2021-03-29 के बारे में कैसे? क्या वे स्वरूपित तारों के रूप में संग्रहीत हैं? Microsoft के इस दस्तावेज़ के आधार पर, यह ऐसा नहीं है।
उदाहरण के लिए, DATE डेटा प्रकार लेते हैं। इसे 3-बाइट पूर्णांक के रूप में संग्रहीत किया जाता है।
हम कैसे जानते हैं?
ठीक है, माइक्रोसॉफ्ट का कहना है कि ऐसा है लेकिन अधिक जानकारी प्रदान नहीं करता है। इसका मतलब यह नहीं है कि हम इसे निश्चित रूप से नहीं जान सकते। सबसे पहले, DATE डेटा प्रकार का न्यूनतम मान 01/01/0001 या 1 जनवरी, 1 CE या सामान्य युग है। इसे एक पूर्णांक में बदलने के लिए, हम पहले उस तारीख को VARBINARY में बदलते हैं, जैसे:
SELECT CAST(CAST('01/01/0001' AS DATE) AS VARBINARY(3))
परिणाम 0x000000 . है हेक्साडेसिमल प्रारूप में। इस मान से, हम देख सकते हैं कि 1 जनवरी, 1 CE का पूर्णांक मान 0 है। यह तार्किक है क्योंकि यह न्यूनतम DATE मान है।
अब, हम 1 दिन आगे बढ़ते हैं।
SELECT CAST(CAST('01/02/0001' AS DATE) AS VARBINARY(3)) -- January 2, 1 CE
परिणाम 0x010000 . है . यह थोड़ा मुश्किल है, लेकिन इस पोस्ट ने हमें एक विचार दिया। हम इसका इलाज नहीं कर सकते जैसा कि हम इसे देखते हैं। बाइट उलट जाते हैं, और वास्तविक हेक्स मान 0x000001 . है . यदि आप हेक्स संख्याओं के बारे में कुछ जानते हैं, तो आप जानते हैं कि यह 1 के बराबर है - यह 1 जनवरी, 1 सीई के शुरुआती बिंदु से 1 दिन है।
अब, आइए हाल की तारीख देखें:03/29/2021।
SELECT CAST(CAST('03/29/2021' AS DATE) AS VARBINARY(3))
परिणाम 0x55420B . है . जब हम इसे उल्टा करते हैं, तो यह 0x0B4255 . हो जाता है . इस बार हम इसे देखकर मूल्य नहीं जान सकते। इसलिए, हम इसे एक पूर्णांक के रूप में 1 से गुणा करते हैं।
SELECT 0x0B4255 * CAST(1 AS INT)
परिणाम 737,877 . है . यह 1 जनवरी, 1 सीई से दिनों की संख्या है। आइए इसे DATEDIFF से सत्यापित करें।
SELECT DATEDIFF(DAY,CAST('01/01/0001' AS DATE),CAST('03/29/2021' AS DATE))
परिणाम वही है:737,877 दिन। बहुत बढ़िया!
नीचे-पंक्ति:स्वरूपित तिथि केवल प्रस्तुति उद्देश्यों के लिए है
इस प्रकार SQL सर्वर DATE डेटा प्रकारों को संग्रहीत करता है। यह DATETIME, SMALLDATETIME, और DATETIME2 के लिए अलग है, लेकिन फिर भी पूर्णांक के रूप में संग्रहीत है। SQL सर्वर शुरुआती बिंदु से समय अवधि की गणना करता है और उस तारीख को प्रदर्शित करता है जिसे हम सभी समझ सकते हैं।
चाहे आप इसे SQL सर्वर प्रबंधन स्टूडियो में देख रहे हों, SQL सर्वर के लिए dbForge स्टूडियो, या आपका ऐप, 03/29/2021 केवल एक प्रस्तुति है। यदि आप क्षेत्र या भाषा बदलते हैं, तो संगृहीत मान 0x55420B वही रहेगा।
अब हम जानते हैं कि तिथियों को तार के रूप में संग्रहीत नहीं किया जाता है। हम किसी विशिष्ट प्रारूप में दिनांक संग्रहीत करना भूल सकते हैं . ऐसा नहीं है कि यह वैसे भी काम करता है। इसके बजाय, आइए SQL में आपके ऐप्स के लिए आवश्यक तिथियों को प्रारूपित करने के विभिन्न तरीकों पर गौर करें।
तिथियां प्रारूपित करने के 4 आसान तरीके
आइए निम्नलिखित SQL दिनांक कार्यों की जाँच करें:
- कन्वर्ट फ़ंक्शन
- भाषा सेट करें
- दिनांक प्रारूप सेट करें
- फ़ॉर्मेट फ़ंक्शन
आप SQL क्वेरी फ़ॉर्मेटर का भी उपयोग कर सकते हैं।
<एच3>1. कन्वर्ट फ़ंक्शनCONVERT डेटा रूपांतरण कार्यों में से एक है जो दिनांक स्वरूपण के लिए भी काम कर सकता है। चित्र 1 एक उदाहरण प्रदर्शित करता है।
CONVERT के पहले दो तर्क लक्ष्य डेटा प्रकार और दिनांक मान हैं। तीसरा वैकल्पिक है लेकिन यह तिथियों पर भी लागू होता है। संख्यात्मक मान दिनांक से स्ट्रिंग में रूपांतरण के दौरान उपयोग करने के लिए SQL दिनांक प्रारूप शैलियाँ हैं।
चित्र 1 में, जापान साल-महीने-दिन के प्रारूप का उपयोग एक विभाजक के रूप में स्लैश के साथ करता है। जर्मनी दिन-महीने-वर्ष का उपयोग डॉट्स के साथ विभाजक के रूप में करता है। ब्रिटेन और फ्रांस जर्मनी के समान अनुक्रम का उपयोग करते हैं, लेकिन एक विभाजक के रूप में एक स्लैश के साथ। केवल संयुक्त राज्य अमेरिका महीने-दिन-वर्ष का उपयोग हाइफ़न के साथ विभाजक के रूप में करता है।
SQL में, आप DATETIME एक्सप्रेशन को DATE में भी बदल सकते हैं।
SQL में CONVERT दिनांक स्वरूप शैलियों की पूरी सूची के लिए, Microsoft से यह संदर्भ देखें।
<एच3>2. भाषा सेट करेंयह सेटिंग सत्र पर लागू की गई भाषा को निर्दिष्ट करती है। यह दिनांक स्वरूपों और सिस्टम संदेशों को प्रभावित करता है। जब आप कोई भाषा सेट करते हैं, तो आप SET DATEFORMAT सेटिंग्स को भी परोक्ष रूप से लागू करते हैं (हम इसे बाद में हल करेंगे)।
अभी के लिए, आइए चित्र 2 में उदाहरणों की जाँच करें। मैं भाषा सेटिंग को लिथुआनियाई और फिर वापस अंग्रेज़ी में बदल रहा हूँ।
चित्र 2 को देखें। लिथुआनियाई तिथि प्रारूप वर्ष-महीने-दिन है। जब भी मैं अलग-अलग तिथियों की कोशिश करता हूं, लंबी तारीख में हमेशा महीने से पहले 'एम' और दिन के बाद 'डी' शामिल होता है। महीने का पहला अक्षर और कार्यदिवस का नाम भी बड़े अक्षरों में नहीं है। यह अन्य भाषा सेटिंग्स के लिए अलग है लेकिन आपको बात समझ में आती है।
SET LANGUAGE के बारे में अधिक जानकारी के लिए, Microsoft का यह संदर्भ देखें।
<एच3>3. दिनांक प्रारूप सेट करेंयह सेटिंग दिनांक वर्ण स्ट्रिंग की व्याख्या करने के लिए महीने, दिन और वर्ष का क्रम रखती है। यह SET LANGUAGE द्वारा की गई निहित दिनांक प्रारूप सेटिंग को ओवरराइड कर देगा। यहाँ चित्र 3 में एक उदाहरण दिया गया है।
चित्र 3 में, कोड DMY या दिन-महीने-वर्ष प्रारूप का उपयोग करता है। इन सेटिंग्स के तहत, दिनांक चर पर सेट कोई भी दिनांक मान इस पैटर्न का पालन करना चाहिए। 30/03/2021 इस प्रारूप से मेल खाता है, लेकिन 03/31/2021 एक त्रुटि उत्पन्न करता है क्योंकि 31 एक मान्य महीना नहीं है।
इस प्रकार, यदि तर्क किसी अन्य प्रारूप के आधार पर संचालित होता है, तो दिनांक प्रारूप में परिवर्तन आपके ऐप को तोड़ सकता है।
SET DATEFORMAT के बारे में अधिक जानकारी के लिए, Microsoft का यह संदर्भ देखें।
<एच3>4. प्रारूप समारोहउपलब्ध सभी स्वरूपण विकल्पों में से, यह सबसे लचीला है। यह .Net में दिनांक स्वरूपण के समान है, क्योंकि FORMAT सर्वर पर .Net Framework की उपस्थिति पर निर्भर करता है जहां SQL सर्वर स्थापित है। हालांकि, इस विकल्प की यही कमी है।
इसे सी # में करने की तरह, FORMAT एक दिनांक मान और एक प्रारूप स्ट्रिंग लेता है। आइए चित्र 4 में कुछ उदाहरण देखें।
नेट की तरह, SQL सर्वर में, आप विभिन्न विभाजकों का उपयोग करके तिथियों को प्रारूपित कर सकते हैं। साथ ही, आप महीने, दिन और साल को कहीं भी रख सकते हैं। फिर, आप सांस्कृतिक जानकारी प्राप्त कर सकते हैं और उसके दिनांक स्वरूप का उपयोग कर सकते हैं।
FORMAT पर अधिक जानकारी और उदाहरणों के लिए, Microsoft का यह संदर्भ देखें।
अब, हमने दिनांक स्वरूपित करने के 4 तरीके और दिनांक स्वरूपों की विविधता की पहचान की है। क्या कोई मानक प्रारूप है जो स्ट्रिंग को तिथियों में परिवर्तित करते समय हमेशा काम करता है?
ISO 8601 - सबसे पोर्टेबल, त्रुटि रहित SQL दिनांक स्वरूप जिसे आप रूपांतरण के लिए उपयोग कर सकते हैं
ISO 8601 1988 से मौजूद है। यह तिथियों और समय से संबंधित डेटा के आदान-प्रदान में अंतर्राष्ट्रीय मानक है। ।
यह CONVERT फ़ंक्शन में दिनांक स्वरूप शैलियों में से एक के रूप में भी उपलब्ध है:शैलियाँ 126 और 127 ISO 8601 अनुरूप हैं।
क्या इसे पोर्टेबल और त्रुटि रहित बनाता है?
गैर-ISO 8601 फ़ॉर्मेट की समस्या
आइए एक उदाहरण के साथ गैर-आईएसओ 8601 के लिए परेशानी का प्रदर्शन करें:
DECLARE @d VARCHAR(10) = '03/09/2021';
SET LANGUAGE Italian;
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
SET LANGUAGE English
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
SET DATEFORMAT DMY
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
SET DATEFORMAT MDY
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
आपके दिनांक स्थान के आधार पर, आप @d की व्याख्या 9 मार्च, 2021 या 3 सितंबर, 2021 के रूप में कर सकते हैं। आप सुनिश्चित नहीं हो सकते कि कौन सा है। यहीं समस्या है।
नीचे दिए गए चित्र 5 में परिणाम देखें:
यहां तक कि SQL सर्वर भी निश्चित रूप से इसे नहीं जानता है!
सबसे खराब, इस तरह का परिदृश्य आपके ऐप को ठीक वैसे ही तोड़ सकता है जैसे पहले चित्र 3 में हुआ था। बहुसांस्कृतिक उपयोगकर्ताओं के साथ व्यवहार करने वाले ऐप्स के लिए यह स्थिति समस्याग्रस्त है।
क्या ISO 8601 इसमें मदद कर सकता है?
फ़ॉर्मेटिंग समस्याओं से निपटने के लिए ISO 8601 का उपयोग करना
ध्यान दें कि ISO 8601 प्रारूप yyyyMMdd . कब है MM/dd/yyyy . के बजाय प्रयोग किया जाता है और चित्र 6 में परिणाम देखें:
यह हमेशा 9 मार्च होगा, इससे कोई फ़र्क नहीं पड़ता कि कौन सी भाषा और दिनांक प्रारूप सेटिंग का उपयोग किया गया है। यह डेटा एक्सचेंज और सिस्टम इंटीग्रेशन के लिए बहुत अच्छा है। यदि आपके उपयोगकर्ता के पास स्टेशन में कोई अन्य दिनांक प्रारूप है, तो इससे कोई फर्क नहीं पड़ेगा।
यदि आप अपनी तिथियों को स्ट्रिंग्स और बैक में बदलना चाहते हैं, तो ISO 8601 का उपयोग करें।
SQL सर्वर में ISO 8601 2 फ्लेवर में आता है:
- YYYYMMDD केवल तिथियों के लिए है।
- YYYY-MM-DDTHH:MM:SS दिनांक और समय के मिश्रण के लिए, जहाँ T दिनांक और समय के बीच का परिसीमक है।
एप्लिकेशन से SQL सर्वर पर दिनांक स्वरूपों को प्रबंधित करने के अन्य तरीके
<एच3>1. ऐप में दिनांक-जागरूक नियंत्रणों का उपयोग करेंजब आप किसी उपयोगकर्ता से किसी प्रपत्र में दिनांक इनपुट करने के लिए कहते हैं, तो उन्हें निःशुल्क टेक्स्ट का उपयोग न करने दें। दिनांक नियंत्रणों का उपयोग करें जो केवल मान्य मानों में से चुनने की अनुमति देते हैं।
<एच3>2. आवश्यकता पड़ने पर ही किसी भिन्न प्रारूप में कनवर्ट करेंतिथियों को स्ट्रिंग्स में परिवर्तित न करें और इसके विपरीत। कॉलिंग ऐप के मूल दिनांक या दिनांक समय डेटा प्रकारों का उपयोग करें। यदि आपको किसी भी कारण से उन्हें बदलने की आवश्यकता है, तो ISO 8601 का उपयोग करें।
<एच3>3. यदि लागू हो तो अपने ऐप स्टार्टअप में दिनांक/समय, समय क्षेत्र और संस्कृति सेट करेंयदि आपका ऐप एक निश्चित दिनांक प्रारूप का उपयोग करता है, और आपके उपयोगकर्ता दिनांक स्वरूपों को बदलना पसंद करते हैं, तो आप एप्लिकेशन स्टार्टअप पर दोनों को ठीक कर सकते हैं। स्पष्ट रूप से सेट करें कि आपके ऐप को क्या चाहिए। यह बहुत बेहतर होगा यदि आपका नेटवर्क व्यवस्थापक इन सेटिंग्स को लॉक कर सकता है।
टेकअवे
तो, SQL दिनांक स्वरूप की किस्मों को संभालना भारी है? यदि आप अभी भी इसे इस तरह पाते हैं तो मैं आपको दोष नहीं दे सकता, लेकिन हमने पाया है कि यह असंभव नहीं है।
यहां हमने कवर किया है:
- SQL तिथियां पूर्णांक के रूप में संग्रहीत की जाती हैं . हम अपनी आंखों से जो देखते हैं वह पहले से ही SQL सर्वर सेटिंग्स के आधार पर स्वरूपित होता है। कोई फर्क नहीं पड़ता कि हम कितनी बार भाषा और दिनांक स्वरूप बदलते हैं, संग्रहीत मूल्य वही रहेगा। किसी विशिष्ट प्रारूप में तिथियों को संग्रहीत करने के बारे में सोचना बेकार है।
- तिथियां प्रारूपित करने के 4 तरीके हैं:कन्वर्ट , भाषा सेट करें , डेटफॉर्मेट सेट करें , और फ़ॉर्मेट ।
- यदि आप तारीखों को स्ट्रिंग्स में बदलना चाहते हैं और इसके विपरीत, आईएसओ 8601 प्रारूप का उपयोग करें ।
- दिनांक प्रारूपों से निपटने के 3 अन्य तरीके हैं:
- तारीख-जागरूक नियंत्रणों का उपयोग करना आपके ऐप में;
- आवश्यकता होने पर ही तारीखों को स्ट्रिंग में बदलना;
- लागू होने पर स्टार्टअप पर आवश्यक समय क्षेत्र, संस्कृति, सर्वर दिनांक/समय निर्धारित करना ।
क्या आपको लगता है कि यह आपके और दूसरों के लिए उपयोगी होगा? फिर, कृपया इस लेख को अपने पसंदीदा सोशल मीडिया प्लेटफॉर्म पर साझा करें।