2010-01-05 15 views
20

पर माइग्रेट करें मेरे पास कुछ पंक्तियों वाली पुरानी तालिका है जिसमें डेटाटाइम कॉलम है। मैं इसे डेटाटाइमसेट पर स्विच करना चाहता हूं लेकिन मैं पहले से मौजूद डेटा को स्थानांतरित करने में सक्षम होना चाहता हूं।SQL सर्वर डेटटाइम कॉलम को डेटटाइमऑफसेट

SET IDENTITY_INSERT Table_Temp ON 

INSERT INTO Table_Temp 
    (Col0, ... ColN,) 
SELECT 
    COl0,.... ColN, from 
Table_Original; 

SET IDENTITY_INSERT Table_Temp OFF 

यह काम करता है लेकिन ऑफसेट सेट 0 है जब मैं datetimeoffset काम करने के लिए dattime कार्य करें: इसलिए मैं कुछ ऐसा कर रहा हूँ। सौभाग्य से ऑफसेट जिसे मैं इसे सेट करना चाहता हूं वह वर्तमान प्रणाली का ऑफसेट है। मैं कोई tsql गुरु नहीं हूँ, लेकिन मुझे ऐसा करने का एक आसान तरीका नहीं लग रहा है।

मैं रूपांतरण के भीतर ऑफ़सेट सेट करने में सक्षम होना चाहता हूं। मैं एक सी # उपयोगिता (या पावरशेल) करने का सहारा ले रहा था, लेकिन मैं इसे सरल रखना चाहूंगा।

+0

--- धन्यवाद दोस्तों, मैं उस में स्पष्ट किया जाना चाहिए था मैं बस को जोड़ने के लिए समय को परिवर्तित किए बिना भरपाई करना चाहता था। लेकिन तुम लोग मुझे वहाँ मिला! ;) – hdz

उत्तर

4

आप एसक्यूएल सर्वर कि datetimeoffset प्रकार के जानता है की एक संस्करण का उपयोग कर रहे हैं, यह वाक्य रचना आप स्थानीय TZ सर्वर ऑफसेट प्राप्त करने के लिए काम करेंगे:

select datepart(tz,sysdatetimeoffset())

परिणाम है मिनटों में।

+0

इसके लिए धन्यवाद, बिल्कुल मुझे क्या चाहिए। वे अब इतने सारे ओवरलैपिंग शब्दों का उपयोग कर रहे हैं कि दस्तावेज़ों को भी खोजना मुश्किल हो गया है ... –

2

आप यह पता लगा सकते हैं कि वर्तमान SQL सर्वर का ऑफ़सेट निम्न का उपयोग कर रहा है।

select datediff(MI,getdate(), getutcdate()) 

आप मिनटों में ऑफसेट और नहीं घंटे पाने के लिए के बाद से वहाँ आधे घंटे के एक नंबर और यहां तक ​​कि एक चौथाई घंटे समय क्षेत्र हैं की जरूरत है।

मिनट मूल्य का उपयोग करके आप दक्षता के लिए की तरह

select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField) 

कुछ का उपयोग करके अपने मूल्यों में जा रहा (यह मानते हुए वे ऐतिहासिक रूप से सभी स्थानीय समय के रूप में दर्ज किया गया) को बदल सकते हैं मैं इसे एक बार गणना करेंगे एक चर और उपयोग में कि, क्योंकि अंतर बदलने वाला नहीं है।

+2

यदि आपको डेलाइट बचत समय के लिए खाते की आवश्यकता है तो यह ऐतिहासिक तिथियों पर काम नहीं करता है। सही? आप अपने वर्तमान यूटीसी ऑफसेट को गेटडेट के आधार पर ढूंढ रहे हैं और फिर इसे ऐतिहासिक दिनांक फ़ील्ड में जोड़ रहे हैं। लेकिन, यदि आप डीएसटी के लिए खाता बनाना चाहते हैं तो ऑफसेट बदल जाता है। पूर्वी मानक समय यूटीसी -5 है, लेकिन पूर्वी डेलाइट समय यूटीसी -4 है। यदि आप ऐतिहासिक तिथियों को परिवर्तित करना चाहते हैं तो आपको डेलाइट सेविंग संक्रमणों से अवगत होना चाहिए। (मुझे इसके बारे में सोचने में सिरदर्द मिलता है)। –

+0

सही करें, और फिर ऐतिहासिक डेटा को बैचों में स्थानांतरित करें, फिर ईसीई वर्ष के लिए खाते में अलग-अलग बिंदु होने पर खाते को स्थानांतरित किया जाए। – Andrew

+0

आप ऐतिहासिक तारीख के ऑफसेट को खोजने के बारे में कैसे जाएंगे? – Jeremy

22

डॉक के लिए नीचे देखें, तो आप शायद कुछ की तरह हैं:

-- up here set the @time_zone variable. 

INSERT INTO Table_Temp 
    (Col0, ... ColN,) 
SELECT 
    COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from 
Table_Original; 

से MSDN

SWITCHOFFSET समारोह एक निर्दिष्ट समय क्षेत्र में एक इनपुट DATETIMEOFFSET मूल्य समायोजित कर देता है, जबकि संरक्षण यूटीसी मूल्य। वाक्यविन्यास SWITCHOFFSET (डेटाटाइमसेट_वैल्यू, टाइम_ज़ोन) है। उदाहरण के लिए, निम्नलिखित कोड समय क्षेत्र में मौजूदा प्रणाली datetimeoffset मूल्य समायोजित कर देता है जीएमटी 05: 00:

चयन SWITCHOFFSET (SYSDATETIMEOFFSET(), '-05: 00');

तो अगर मौजूदा प्रणाली datetimeoffset मान 12 फ़रवरी, 2009 10: 00: ००.००००००० -08: 00:: ००.००००००० -05: 00 00, इस कोड मूल्य 12 फरवरी, 2009 13 देता है।

TODATETIMEOFFSET फ़ंक्शन इनपुट तिथि के समय क्षेत्र ऑफसेट और समय मान सेट करता है। इसका वाक्यविन्यास TODATETIMEOFFSET (date_and_time_value, time_zone) है।

यह फ़ंक्शन SWITCHOFFSET से कई तरीकों से अलग है। सबसे पहले, यह इनपुट के रूप में डेटाटाइमसेट मान तक सीमित नहीं है; बल्कि यह किसी भी दिनांक और समय डेटा प्रकार स्वीकार करता है।दूसरा, यह करने की कोशिश नहीं कर रहा है के बजाय सिर्फ एक datetimeoffset मूल्य के रूप में इनपुट तारीख और निर्धारित समय क्षेत्र के साथ समय मान देता है समय स्रोत मान और निर्दिष्ट समय क्षेत्र लेकिन के बीच समय क्षेत्र अंतर के आधार को समायोजित ।

TODATETIMEOFFSET समारोह का मुख्य उद्देश्य है प्रकार उस समय क्षेत्र दिया समय ऑफसेट क्षेत्र द्वारा DATETIMEOFFSET को जानकारी नहीं है परिवर्तित करने के लिए। अगर दी गई तारीख और समय मूल्य एक DATETIMEOFFSET है, TODATETIMEOFFSET समारोह में परिवर्तन एक ही मूल स्थानीय दिनांक और समय मूल्य के साथ साथ नए दिया समय क्षेत्र ऑफसेट के आधार पर DATETIMEOFFSET मूल्य। 00: ००.००००००० -08:

उदाहरण के लिए, वर्तमान प्रणाली datetimeoffset मूल्य 12 फरवरी, 2009 10 है 00, और आपको निम्न कोड को चलाने :

चयन TODATETIMEOFFSET (SYSDATETIMEOFFSET(), '-05: 00');

मूल्य फरवरी 12, 200 9 10: 00: 00.0000000 -05: 00 वापस आ गया है। याद रखें SWITCHOFFSET समारोह लौट आए है कि 12 फरवरी, 2009 13: 00: ००.००००००० -05: 00 क्योंकि यह (-08: 00) इनपुट के बीच समय क्षेत्र अंतर के आधार पर समय समायोजित और निर्दिष्ट समय क्षेत्र (-05: 00)।

जैसा कि पहले बताया गया है, आप TODATETIMEOFFSET फ़ंक्शन का उपयोग दिनांक और समय डेटा प्रकार इनपुट के रूप में कर सकते हैं। उदाहरण के लिए, निम्न कोड लेता मौजूदा प्रणाली की तारीख और समय मूल्य और एक समय क्षेत्र -00 के साथ एक datetimeoffset मूल्य रूप रिटर्न यह: 05:

चयन TODATETIMEOFFSET (SYSDATETIME(), '-05: 00 ');

+1

इस वी। पुरानी पोस्ट पर एक टिप्पणी। टाइमज़ोन और दिनांक समय का ऑफ़सेट अलग-अलग चीजों के लिए है। टाइमज़ोन खाते में डीएसटी लेता है जबकि ऑफसेट बस ऑफसेट होता है। –

4

यदि डीएसटी बचत लक्ष्य समय क्षेत्र में सक्रिय है, तो ये रूपांतरण कार्य सही तरीके से काम नहीं करेंगे, क्योंकि उसी वर्ष के दौरान टाइमज़ोन ऑफसेट बदल जाता है।

+2

डीएसटी को ध्यान में रखते हुए आप इसे सही तरीके से कैसे करेंगे? – Jeremy

1

किसी भी व्यक्ति को इस समस्या को सही ढंग से हल करने का प्रयास करने के लिए, यहां डीएसटी के लिए लेखांकन करना ऐसा टूल है।

https://github.com/mj1856/SqlServerTimeZoneSupport

0

यह पहले से ही प्रदान की एक जवाब की एक मामूली बदलाव है, और डीएसटी परिवर्तन के लिए खाते में नहीं है।हालांकि, यह कई प्रयोजनों के लिए काफी अच्छा हो सकता है:

dateadd(minute, -datepart(tz, sysdatetimeoffset()), @legacyDatetime) 
संबंधित मुद्दे