Microsoft SQL Server डेटाबेस विभिन्न स्वरूपों में दिनांक और समय की जानकारी संग्रहीत करता है। उनमें से सबसे आम हैं दिनांक समय , दिनांक समय2 , और तारीख . जैसा कि सभी प्रकार के डेटा के साथ होता है, समस्याएँ समय-समय पर हो सकती हैं। इस लेख में, हम SQL समय और दिनांक डेटा प्रकारों के साथ काम करते समय आपके सामने आने वाली कुछ सबसे सामान्य समस्याओं के निवारण पर ध्यान केंद्रित करेंगे।
क्षेत्रीय रूप से भिन्न दिनांक स्वरूपों से संबंधित समस्याएं
तिथियों का प्रारूप विश्व स्तर पर भिन्न होता है। उदाहरण के लिए, ब्रिटिश तिथियां dd-mm-yyyy लिखते हैं, जबकि अमेरिकी mm-dd-yyyy प्रारूप में तिथियां लिखते हैं। इस प्रकार, वही तिथि, 31 दिसंबर 2020, ब्रिटिश तिथि प्रारूप में 31-12-2020 और अमेरिकी प्रारूप में 12-31-2020 के रूप में लिखी जाती है।
यदि आप अपने SQL सर्वर इंस्टेंस की भाषा सेटिंग्स के अनुरूप प्रारूप में दिनांक निर्दिष्ट नहीं करते हैं, तो अक्षमता समस्याएँ उत्पन्न हो सकती हैं।
निम्न स्क्रिप्ट टेक्स्ट स्ट्रिंग को दिनांक जानकारी के साथ DATETIME प्रारूप में परिवर्तित करती है। भाषा सेटिंग ब्रिटिश पर सेट हैं। टेक्स्ट स्ट्रिंग में शामिल हैं 31-12-2020 04:25:30 ।
यदि आप इस स्ट्रिंग को DATETIME प्रारूप में डालते हैं, तो 31 को दिन के रूप में माना जाएगा, जबकि 12 को डिफ़ॉल्ट रूप से महीना माना जाएगा। इसलिए, रूपांतरण सफल होगा जैसा कि आउटपुट से दिखाया गया है:
SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '31-12-2020 04:25:30';
SELECT CAST(@date AS DATETIME);
हालांकि, यदि आप दिनांक 31-12-2020 . वाली स्ट्रिंग को कनवर्ट करने का प्रयास करते हैं US_ENGLISH . का उपयोग करके DATETIME प्रारूप में भाषा सेटिंग्स, आपको एक त्रुटि प्राप्त होगी जैसा कि नीचे दिखाया गया है:
SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '31-12-2020 04:25:30';
SELECT CAST(@date AS DATETIME);
त्रुटि इसलिए होती है क्योंकि US_ENGLISH भाषा सेटिंग 31 . को परिभाषित करती है एक दिन के बजाय एक महीने के रूप में। माह . के रूप में मान 12 से अधिक नहीं हो सकता है, हमें आउट-ऑफ-रेंज मान त्रुटि प्राप्त हो रही है ।
यदि आप दिनांक 12-31-2020 के रूप में निर्दिष्ट करते हैं और फिर US_ENGLISH सेटिंग का उपयोग करके दिनांक स्ट्रिंग को DATETIME में कनवर्ट करते हैं, तो आप सफल रूपांतरण देखेंगे:
SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '12-31-2020 04:25:30';
SELECT CAST(@date AS DATETIME);
इसी तरह, 12-31-2020 . को रूपांतरित करना ब्रिटिश भाषा सेटिंग के तहत दिनांक स्ट्रिंग भी एक त्रुटि का कारण बनती है - 31 को एक महीने के रूप में माना जाता है, जो नहीं हो सकता।
SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '12-31-2020 04:25:30';
SELECT CAST(@date AS DATETIME);
भाषा सेटिंग्स पर ध्यान दिए बिना अपनी तिथि को सटीक रूप से परिवर्तित करने के लिए, आप दिनांक प्रारूप के लिए आईएसओ मानक 8601 का उपयोग कर सकते हैं। इस मानक का अनुपालन करने के लिए, दिनांक को yyyy-mm-ddThh:mm:ss के रूप में निर्दिष्ट करें ।
उदाहरण के लिए, दिनांक स्ट्रिंग 2020-12-31T04:25:30 को ब्रिटिश भाषा सेटिंग के अंतर्गत DATETIME डेटा प्रकार में सफलतापूर्वक रूपांतरित कर दिया गया है:
SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '2020-12-31T04:25:30';
SELECT CAST(@date AS DATETIME);
निम्न स्क्रिप्ट US_ENGLISH सेटिंग्स के साथ उसी स्ट्रिंग को DATETIME में परिवर्तित दिखाती है:
SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '2020-12-31T04:25:30';
SELECT CAST(@date AS DATETIME);
समय क्षेत्र के विचार
आप वैश्विक दर्शकों के लिए कुछ SQL सर्वर डेटाबेस अनुप्रयोग विकसित करना चाह सकते हैं। उसके लिए, आपको समय क्षेत्र की जानकारी . जोड़ने की आवश्यकता हो सकती है दिनांक और समय डेटा प्रकारों के लिए।
SQL सर्वर में DATETIMEOFFSET डेटा प्रकार समय क्षेत्र ऑफ़सेट के साथ दिनांक और समय की जानकारी संग्रहीत करता है। समय क्षेत्र ऑफ़सेट को यूटीसी +/- घंटों की संख्या के रूप में निर्दिष्ट किया गया है।
उदाहरण के लिए, निम्न स्क्रिप्ट आपके SQL सर्वर इंस्टेंस को चलाने वाले सिस्टम की दिनांक, समय और ऑफ़सेट जानकारी प्राप्त करने के लिए SYSDATETIMEOFFSET() विधि का उपयोग करती है। SYSDATETIMEOFFSET () फ़ंक्शन द्वारा लौटाए गए मान DATETIMEOFFSET प्रकार चर @dateoffset में संग्रहीत होते हैं। @dateoffset वैरिएबल का मान SELECT स्टेटमेंट का उपयोग करके प्रिंट किया जाता है:
DECLARE @dateoffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT @dateoffset
नीचे दिया गया आउटपुट वर्तमान दिनांक और समय और ऑफ़सेट मान को दिखाता है। इस मामले में, यह +02:00 है।
आप DATETIMEOFFSET चर से केवल ऑफ़सेट मान भी प्राप्त कर सकते हैं। ऐसा करने के लिए, आपको DATETIMEOFFSET प्रकार चर को DATENAME() फ़ंक्शन के दूसरे पैरामीटर मान के रूप में पास करना होगा। DATENAME() पद्धति का पहला पैरामीटर tzoffset . होना चाहिए ।
निम्न स्क्रिप्ट वर्तमान सिस्टम दिनांक का समय ऑफ़सेट भाग लौटाती है:
DECLARE @dateoffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT DATENAME(tzoffset, @dateoffset)
एक कस्टम DATETIMEOFFSET चर बनाने के लिए, दिनांक, समय और समय ऑफ़सेट भागों के लिए मान निर्दिष्ट करें। उदाहरण के लिए, निम्न स्क्रिप्ट में, तारीख के लिए मान है 2015-02-22 , समय भाग के लिए मान है 23:59:59:999 , और समय ऑफ़सेट मान +05:00 . है ।
DECLARE @dateoffset DATETIMEOFFSET = '2015-02-22 23:59:59:999 +05:00';
SELECT @dateoffset
अंत में, आप SWITCHOFFSET() . का उपयोग करके समय ऑफसेट जानकारी को भी अपडेट कर सकते हैं समारोह।
आपको DATETIMEOFFSET . पास करना होगा वैरिएबल को पहले पैरामीटर मान के रूप में टाइप करें और नए समय ऑफ़सेट को दूसरे पैरामीटर मान के रूप में SWITCHOFFSET पर पास करें समारोह।
निम्न स्क्रिप्ट DATETIMEOFFSET चर के लिए समय ऑफ़सेट मान को +05:00 से +09:00 तक अपडेट करती है।
DECLARE @dateoffset DATETIMEOFFSET = '2015-02-22 23:59:59:999 +05:00';
SELECT SWITCHOFFSET(@dateoffset, '+09:00');
डेटटाइम के साथ ऑपरेटर के बीच रिकॉर्ड का चयन करना
बीच SQL सर्वर में ऑपरेटर इसे दिए गए मानों की श्रेणी के बीच के रिकॉर्ड को फ़िल्टर करता है।
आप दो तिथियों के बीच रिकॉर्ड वापस करने के लिए BETWEEN ऑपरेटर का उपयोग कर सकते हैं। हालांकि, तारीखों के साथ रिकॉर्ड को छानने के लिए इसका उपयोग करते समय आपको अतिरिक्त सावधानी बरतनी चाहिए।
उदाहरण के लिए, निम्न स्क्रिप्ट एक डमी बनाती है हॉस्टल डेटाबेस और एक विद्यार्थी जोड़ता है इसके लिए टेबल।
CREATE DATABASE Hostel
USE Hostel
CREATE TABLE Student
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Gender VARCHAR (50),
BirthDate DateTime
)
अगली स्क्रिप्ट विद्यार्थी . में कुछ डमी रिकॉर्ड जोड़ती है टेबल। जन्मतिथि विद्यार्थी . का स्तंभ टेबल स्टोर तिथियाँ। इस स्क्रिप्ट से, आप देख सकते हैं कि दो छात्रों सारा और निक की जन्मतिथि समान है। हालांकि, जन्म का समय अलग होता है:
INSERT INTO Student
VALUES ('Jack', 'Male', '2017-06-30 16:30:35'),
('Sara', 'Female', '2015-02-22 00:00:00'),
('Elisa', 'Female', '2020-03-16 22:24:39'),
('Nik', 'Male', '2015-02-22 09:45:55'),
('Jos', 'Male', '2015-03-25 11:55:20')
आपको लगता होगा कि 2015-02-22 को जन्म लेने वाले सभी छात्रों के रिकॉर्ड को पुनः प्राप्त करने के लिए BETWEEN ऑपरेटर का उपयोग किया जा सकता है।
SELECT * FROM Student
WHERE BirthDate BETWEEN '2015-02-22' AND '2015-02-22'
लेकिन अगर आप उपरोक्त स्क्रिप्ट को निष्पादित करते हैं, तो आप देखेंगे कि समय . के बावजूद, केवल एक रिकॉर्ड लौटाया गया है भाग भी शामिल है।
इसका कारण यह है कि BETWEEN ऑपरेटर डिफ़ॉल्ट रूप से 2015-02-22 के DATETIME मान को मानता है जैसा 2015-02-22 00:00:00 . इसलिए, उपरोक्त क्वेरी में BETWEEN ऑपरेटर ने जन्मतिथि के साथ रिकॉर्ड की खोज की 2015-02-22 00:00:00 और 2015-02-22 00:00:00 के बीच का मान .
इस समस्या को हल करने के लिए, हमें DATETIME डेटा प्रकार के साथ BETWEEN ऑपरेटर का उपयोग करते समय समय भाग निर्दिष्ट करना होगा।
निम्न स्क्रिप्ट 2015-02-22 00:00:00 के बीच सभी रिकॉर्ड लौटा देगी और 2015-02-22 23:59:59:999 . ऊपरी तिथि सीमा के लिए समय भाग 23:59:999 है।
SELECT * FROM Student
WHERE BirthDate BETWEEN '2015-02-22' AND '2015-02-22 23:59:59:999';
आउटपुट में, हमें जन्मतिथि . के लिए दो रिकॉर्ड मिलते हैं - 2015-02-22 ।
दिनांक सीमाओं से संबंधित समस्याएं
DATETIME डेटा प्रकार केवल वर्ष 1753 से 9999 तक का समर्थन करता है। इसलिए, यदि आप 9999 से अधिक या 1753 से कम मान वाली किसी तिथि को संग्रहीत करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी।
निम्न स्क्रिप्ट 1392-12-31 . को रूपांतरित करने का प्रयास करती है दिनांक स्ट्रिंग। 1392 1753 से कम है। इसलिए, हमारे पास आउट-ऑफ-रेंज मान त्रुटि है।
DECLARE @date VARCHAR(50) = '1392-12-31 04:25:30';
SELECT CAST(@date AS DATETIME);
साल के मानों को 1753 से कम स्टोर करने के लिए , आप DATETIME2 . का उपयोग कर सकते हैं डेटा प्रकार। यह साल के मूल्यों को 0000 से 9999 तक स्टोर करता है।
निम्न स्क्रिप्ट दिनांक स्ट्रिंग 1392-12-31 को DATETIME2 डेटा प्रकार में सफलतापूर्वक रूपांतरित करती है:
DECLARE @date VARCHAR(50) = '1392-12-31 04:25:30';
SELECT CAST(@date AS DATETIME2);
दिनांक समय रूपांतरण के लिए TRY_COVERT का उपयोग करना
SQL सर्वर में CONVERT फ़ंक्शन डेटा को एक प्रकार से दूसरे प्रकार में कनवर्ट करता है। आप इसका उपयोग दिनांक-प्रकार के डेटा स्वरूपों को अन्य स्वरूपों में परिवर्तित करने के लिए कर सकते हैं और इसके विपरीत। हालाँकि, यदि रूपांतरण विफल हो जाता है, तो CONVERT फ़ंक्शन एक त्रुटि उत्पन्न करता है।
उदाहरण के लिए, हम स्ट्रिंग को परिवर्तित कर रहे हैं 2015-31-31 DATETIME प्रारूप में:
DECLARE @date VARCHAR(50) = '2015-31-13';
SELECT CONVERT(DATETIME, @date ,105) as DOB_CONV
यदि आप चाहते हैं कि त्रुटि संदेश के बजाय रूपांतरण विफल होने पर NULL मान लौटाया जाए, तो TRY_CONVERT का उपयोग करें समारोह। यह विधि एप्लिकेशन को क्रैश नहीं होने देगी - यह केवल एक NULL मान लौटाती है।
DECLARE @date VARCHAR(50) = '2015-31-13';
SELECT TRY_CONVERT(DATETIME, @date ,105) as DOB_CONV
निष्कर्ष
SQL सर्वर के साथ काम करते हुए, आपको अपने अनुभव को खराब करने और कार्यों को जटिल बनाने में बहुत सारी समस्याओं का सामना करना पड़ सकता है। दूसरी ओर, सबसे आम परेशानियों को जानना, उन्हें होने से रोकने का सबसे कारगर तरीका है। इसलिए हमने इस लेख को दिनांक और समय की जानकारी के साथ आपके काम के दौरान होने वाली ऐसी असुविधाओं के निवारण के लिए समर्पित किया है।
यह भी ध्यान दें कि SQL सर्वर डेटाबेस के साथ काम करने के लिए आधुनिक उपकरण DB विशेषज्ञों के जीवन को बहुत आसान बना सकते हैं। विशेष रूप से, SQL सर्वर के लिए dbForge Studio दिनांकों के साथ व्यवहार करते समय लागू करने के लिए दृश्य डेटा संपादक सुविधा प्रदान करता है। आप इसका उपयोग सबसे उपयोगकर्ता के अनुकूल तरीके से तिथियों को देखने और संपादित करने के लिए कर सकते हैं।