1 जनवरी 1970 यूटीसी के बाद से यूनिक्स टाइमस्टैम्प सेकंड की पूर्णांक संख्या है।
मान लें कि आपके डेटाबेस में इस नंबर के साथ एक पूर्णांक कॉलम है, तो आपके डेटाबेस सर्वर का समय क्षेत्र अप्रासंगिक है।
सबसे पहले टाइमस्टैम्प को datetime
. में बदलें टाइप करें:
SELECT DATEADD(second, yourTimeStamp, '1970-01-01')
यह यूटीसी datetime
होगा जो आपके टाइमस्टैम्प से मेल खाती है।
फिर आपको यह जानना होगा कि इस मान को अपने लक्षित समय क्षेत्र में कैसे समायोजित किया जाए। डेलाइट सेविंग टाइम के कारण अधिकांश दुनिया में, एक ज़ोन में कई ऑफ़सेट हो सकते हैं।
दुर्भाग्य से, SQL सर्वर में कार्य समय क्षेत्र को सीधे काम करने की कोई क्षमता नहीं है। इसलिए यदि आप, उदाहरण के लिए, यूएस पैसिफिक समय का उपयोग कर रहे हैं, तो आपके पास यह जानने का कोई तरीका नहीं होगा कि आपको 7 घंटे घटाना चाहिए या 8 घंटे। अन्य डेटाबेस (Oracle, Postgres, MySql, आदि) में इसे संभालने के लिए अंतर्निहित तरीके हैं, लेकिन अफसोस, SQL सर्वर नहीं करता है। इसलिए यदि आप एक सामान्य प्रयोजन समाधान की तलाश में हैं, तो आपको निम्न में से एक करना होगा:
-
किसी तालिका में समय क्षेत्र डेटा आयात करें, और समय क्षेत्र के नियम बदलते ही उस तालिका को बनाए रखें। किसी विशेष तिथि के लिए ऑफ़सेट को हल करने के लिए उस तालिका का उपयोग कस्टम तर्क के समूह के साथ करें।
-
xp_regread
का उपयोग करें Windows रजिस्ट्री कुंजियों को प्राप्त करने के लिए जिसमें समय क्षेत्र डेटा होता है, और फिर से किसी विशेष तिथि के लिए ऑफ़सेट को हल करने के लिए कस्टम तर्क का एक समूह का उपयोग करें। बेशक,xp_regread
करना एक बुरी बात है, इसके लिए कुछ अनुमतियों की आवश्यकता होती है, और यह समर्थित या दस्तावेज़ नहीं है। -
एक SQLCLR फ़ंक्शन लिखें जो
TimeZoneInfo
. का उपयोग करता है नेट में कक्षा। दुर्भाग्य से, यह एक "असुरक्षित" SQLCLR असेंबली की आवश्यकता है , और इससे बुरी चीजें हो सकती हैं।
आईएमएचओ, इनमें से कोई भी दृष्टिकोण बहुत अच्छा नहीं है, और इसे सीधे एसक्यूएल में करने का कोई अच्छा समाधान नहीं है। सबसे अच्छा समाधान यूटीसी मान (या तो मूल पूर्णांक, या datetime
) वापस करना होगा यूटीसी पर) अपने कॉलिंग एप्लिकेशन कोड में, और इसके बजाय वहां टाइमज़ोन रूपांतरण करें (उदाहरण के लिए, TimeZoneInfo
.नेट या अन्य प्लेटफॉर्म में इसी तरह के तंत्र में)।
फिर भी - आप भाग्यशाली हैं कि कुवैत एक ऐसे क्षेत्र में है (और हमेशा रहा है) जो डेलाइट सेविंग टाइम के लिए नहीं बदलता है। यह हमेशा UTC+03:00 रहा है। तो आप बस तीन घंटे जोड़ सकते हैं और परिणाम वापस कर सकते हैं:
SELECT DATEADD(hour, 3, DATEADD(second, yourTimeStamp, '1970-01-01'))
लेकिन यह जान लें कि यह एक सामान्य प्रयोजन समाधान नहीं है जो किसी भी समय क्षेत्र में काम करेगा।
यदि आप चाहें, तो आप अन्य SQL डेटा प्रकारों में से एक को वापस कर सकते हैं, जैसे कि datetimeoffset
, लेकिन यह आपको केवल यह दर्शाने में मदद करेगा कि मान तीन घंटे के लिए ऑफसेट है जिसे कोई भी इसे देख सकता है। यह रूपांतरण प्रक्रिया को अलग या बेहतर नहीं बनाएगा।
अपडेट किया गया उत्तर
मैंने SQL सर्वर में समय क्षेत्र का समर्थन करने के लिए एक प्रोजेक्ट बनाया है। आप इसे यहां से इंस्टॉल कर सकते हैं . तब आप बस इस तरह रूपांतरित कर सकते हैं:
SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'Asia/Kuwait')
आप IANA tz डेटाबेस से किसी भी समय क्षेत्र का उपयोग कर सकते हैं , उनमें वे भी शामिल हैं जो डेलाइट सेविंग टाइम का उपयोग करते हैं।
यूनिक्स टाइमस्टैम्प से कनवर्ट करने के लिए आप अभी भी ऊपर दिखाए गए तरीके का उपयोग कर सकते हैं। उन दोनों को एक साथ रखना:
SELECT Tzdb.UtcToLocal(DATEADD(second, yourTimeStamp, '1970-01-01'), 'Asia/Kuwait')
फिर से अपडेट किया गया
SQL सर्वर 2016 के साथ, अब समय क्षेत्रों के लिए के साथ अंतर्निहित समर्थन है। AT TIME ZONE
बयान। यह Azure SQL डेटाबेस (v12) में भी उपलब्ध है।
SELECT DATEADD(second, yourTimeStamp, '1970-01-01') AT TIME ZONE 'Arab Standard Time'