2008-10-07 15 views
5

में समय क्षेत्र ऑफ़सेट निर्धारित करें मेरा डेटाबेस एप्लिकेशन विभिन्न समय क्षेत्रों में एकाधिक साइटों पर तैनात किया जा रहा है।टी-एसक्यूएल

मुझे एक टी-एसक्यूएल फ़ंक्शन चाहिए जो YTD गणनाओं के लिए चालू वर्ष के 1 जनवरी को आधी रात के यूटीसी टाइमस्टैम्प को निर्धारित करेगा। सभी डेटा यूटीसी टाइमस्टैम्प में संग्रहीत है।

उदाहरण के लिए, शिकागो डेटाइट सेविंग्स टाइम (डीएसटी) के साथ यूटीसी -6 है, तो 2008 में शिकागो में किसी भी समय चलाने पर फ़ंक्शन को '2008-01-01 06:00:00' वापस करने की आवश्यकता होती है। यदि अगले वर्ष न्यूयॉर्क (जीएमटी -5 + डीएसटी) में भाग लेते हैं, तो उसे '200 9-01-01 05:00:00' वापस करने की जरूरत है।

मैं वर्तमान वर्ष YEAR (GETDATE()) से प्राप्त कर सकता हूं। मैंने सोचा कि मैं ऑफ़सेट निर्धारित करने के लिए GETDATE() और GETUTCDATE() के बीच एक DATEDIFF कर सकता हूं लेकिन परिणाम इस बात पर निर्भर करता है कि क्वेरी डीएसटी के दौरान चलती है या नहीं। मुझे ऑफसेट निर्धारित करने के लिए किसी भी निर्मित टी-एसक्यूएल फ़ंक्शंस के बारे में पता नहीं है या वर्तमान समय डीएसटी है या नहीं?

क्या किसी को टी-एसक्यूएल में इस समस्या का समाधान है? मैं इसे हार्ड कोड कर सकता हूं या इसे एक टेबल में स्टोर कर सकता हूं लेकिन ऐसा नहीं करना चाहूंगा। मुझे लगता है कि एसक्यूएल सर्वर 2005 में सीएलआर एकीकरण का उपयोग करने के लिए यह एक आदर्श स्थिति है। मैं बस सोच रहा हूं कि कोई टी-एसक्यूएल समाधान है जिसे मैं अनजान हूं?

उत्तर

2

चेक बाहर और संबंधित के लिए जवाब जानकारी:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(। संक्षेप में, आप समय क्षेत्र और Sql सर्वर 2005 में डीएसटी तालिका का निर्माण करने के लिए हम समय क्षेत्रों के साथ कुछ मदद मिल Sql सर्वर के अगले संस्करण में क्या ज़रूरत है)

+0

धन्यवाद एरिक। मैंने एक टेबल आधारित समाधान लागू किया है जैसा कि आपने अतीत में सुझाव दिया है। मैं बस सोच रहा था कि क्या ऐसा कुछ था जिसे मैंने याद किया था जिससे मेरा जीवन आसान हो जाएगा। –

0

एचएम, मुझे लगता है कि मैं समस्या को समझ नहीं रहा हूं। यदि डेटाबेस ऐप पहले से ही इसके सभी लेन-देन के लिए यूटीसी टाइमस्टैम्प संग्रहीत कर रहा है - और आप "स्थानीय समय" के पहले के बाद से कुछ मानों को जोड़ना चाहते हैं, तो आपकी स्थिति कुछ ऐसी होनी चाहिए:

(टाइमस्टैम्प + (getutcdate() - getdate()))> डाली ('01/01/2008 को दिनांक के रूप में)

डीएसटी जब वर्ष में क्वेरी चलाया जाता है पर निर्भर करता है पर या बंद हो सकता है - लेकिन getdate() इसे ध्यान में रखता है, इसलिए आपको हर बार ऑफ़सेट की गतिशील गणना करना होगा।

मैं ... लगता है ... :-)

+0

ऑफ़सेट वर्तमान तारीख के सापेक्ष होगा, न कि भविष्य में एक अनियमित तिथि के लिए। साथ ही, यह सर्वर के समय क्षेत्र के सापेक्ष होगा, ग्राहक की नहीं। – neonski

0

जब तक मैं गलत कर रहा हूँ, GETUTCDATE() फ़ंक्शन समय क्षेत्र सर्वर पर परिभाषित का उपयोग करता है - यह ग्राहक के समय क्षेत्र के बारे में कोई जानकारी नहीं है (या किसी भी समय क्षेत्र)। मुझे नहीं लगता कि जानकारी SQL सर्वर 2005 में कहीं भी संग्रहीत है, जो इस जानकारी की गणना करने के लिए असंभव बनाता है।

शायद आप Oracle's time zone file से डेटा उधार ले सकते हैं और अपना स्वयं का SQL सर्वर फ़ंक्शन बना सकते हैं?

विषय बंद (किसी और के लिए उपयोगी हो सकता है), लेकिन यदि आप ओरेकल उपयोग कर रहे थे, तो आप FROM_TZ समारोह और 'समय क्षेत्र एटी' इस्तेमाल कर सकते हैं: इस पिछले प्रश्न

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek' 
संबंधित मुद्दे