AT TIME ZONE
दिनांक को डेटाटाइमऑफ़सेट . में बदलने के लिए SQL सर्वर 2016 में क्लॉज पेश किया गया था लक्ष्य समय क्षेत्र में मूल्य।
यह फ़ंक्शन कुछ अन्य T-SQL फ़ंक्शंस के समान है, जैसे SWITCHOFFSET()
और TODATETIMEOFFSET()
, हालांकि, AT TIME ZONE
क्लॉज आपको वास्तविक ऑफ़सेट मान के बजाय नाम से समय क्षेत्र ऑफ़सेट निर्दिष्ट करने की अनुमति देता है/(आवश्यक है)।
इस लेख में बताया गया है कि कैसे AT TIME ZONE
अन्य कार्यों की तुलना में काम करता है, और इसके लाभों की व्याख्या करता है।
उपयोग का उदाहरण
यहां एक बुनियादी उदाहरण दिया गया है कि कैसे AT TIME ZONE
खंड काम करता है।
DECLARE @dto datetimeoffset = '2020-04-01 00:00:00.0000000 +00:00';
SELECT
@dto AS [Original],
@dto AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time];
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
Original | 2020-04-01 00:00:00.0000000 +00:00 NZ Time | 2020-04-01 13:00:00.0000000 +13:00
आप सोच रहे होंगे कि जब आप SWITCHOFFSET()
का उपयोग कर सकते थे तो Microsoft ने यह सुविधा क्यों शुरू की? एक ही काम करने के लिए कार्य करते हैं?
ठीक है, आप नहीं वास्तव में SWITCHOFFSET()
. के साथ ठीक वैसा ही करें .
SWITCHOFFSET()
के साथ , आपको वास्तविक समय क्षेत्र ऑफ़सेट या तो [+|-]TZH:TZM प्रारूप में या एक हस्ताक्षरित पूर्णांक (मिनटों के लिए) के रूप में प्रदान करना होगा। इसका मतलब है कि आपको सटीक समय क्षेत्र ऑफ़सेट जानने की ज़रूरत है, और चाहे वह समय क्षेत्र वर्तमान में दिन के उजाले की बचत को देख रहा हो या नहीं।
AT TIME ZONE
. के साथ खंड, आपको यह जानने की आवश्यकता नहीं है। आपको केवल समय क्षेत्र का नाम जानना है (और यहां समय क्षेत्र का नाम कैसे प्राप्त करें)।
डेलाइट सेविंग उदाहरण
यहां एक उदाहरण दिया गया है जो AT TIME ZONE
. का उपयोग करने के लाभ को दर्शाता है दिन के उजाले की बचत के संबंध में।
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
@dto1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto1],
@dto2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto2];
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 NZ Time: @dto1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dto2 | 2020-04-07 12:00:00.0000000 +12:00
न्यूज़ीलैंड में, डेलाइट सेविंग 5 मार्च, 2020 को समाप्त होती है। इसलिए इस उदाहरण में मैं दो तिथियों (1 मार्च और 7 मार्च) का उपयोग करता हूं।
जब मैं उन्हें 'न्यूजीलैंड मानक समय' में परिवर्तित करता हूं, AT TIME ZONE
स्वचालित रूप से इसकी गणना में डेलाइट बचत शामिल करता है और लागू तिथि/समय लौटाता है।
इसलिए हम देख सकते हैं कि 1 मार्च की तारीख +13:00 के समय क्षेत्र ऑफ़सेट का उपयोग करती है और 7 मार्च की तारीख +12:00 का उपयोग करती है (क्योंकि डेलाइट बचत 5 मार्च को समाप्त हो गई थी)।
अगर मैंने SWITCHOFFSET()
. का इस्तेमाल किया होता मुझे पता होना चाहिए था कि प्रत्येक तिथि के लिए किस समय क्षेत्र का उपयोग करना है।
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
SWITCHOFFSET(@dto1, '+12:00') AS [+12:00],
SWITCHOFFSET(@dto2, '+13:00') AS [+13:00];
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 +12:00 | 2020-04-01 12:00:00.0000000 +12:00 +13:00 | 2020-04-07 13:00:00.0000000 +13:00
बिना टाइम ज़ोन ऑफ़सेट के तिथियों से कनवर्ट करना
आप AT TIME ZONE
. का भी उपयोग कर सकते हैं समय क्षेत्र ऑफसेट के बिना तिथियों पर। वास्तव में, फ़ंक्शन किसी भी अभिव्यक्ति को स्वीकार करता है जिसे स्मॉलडेटटाइम . के लिए हल किया जा सकता है , डेटाटाइम , डेटाटाइम2 , या डेटाटाइमऑफ़सेट मूल्य।
हालाँकि, जब आप ऐसा करते हैं, तो आपको इस बात का ध्यान रखना होगा कि परिणाम की गणना कैसे की जाती है। जब तिथि ऑफसेट जानकारी के बिना प्रदान की जाती है, तो फ़ंक्शन समय क्षेत्र के ऑफसेट को यह मानते हुए लागू करता है कि इनपुट तिथि लक्ष्य समय क्षेत्र में है।
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
परिणाम:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 00:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 00:00:00.0000000 +12:00
ध्यान दें कि हालांकि समय क्षेत्र ऑफ़सेट निर्दिष्ट के अनुसार लागू किए गए थे, लेकिन इससे दिनांक/समय प्रभावित नहीं हुआ। परिणामी दिनांक/समय दोनों का मान समान है - केवल समय क्षेत्र ऑफ़सेट बदल गया है।
यदि यह वह नहीं है जो आप चाहते हैं, तो आप AT TIME ZONE 'UTC'
add जोड़ सकते हैं वांछित समय क्षेत्र में परिवर्तित होने से पहले, मूल तिथियों को पहले यूटीसी में परिवर्तित करने के लिए मिश्रण में।
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
परिणाम:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 12:00:00.0000000 +12:00