2012-12-05 11 views
5

मेरी स्थिति यह है कि हम 2005 को समर्थन देने वाले SQL सर्वर डेटाबेस में डेटा संग्रहीत करते हैं। जब डेटटाइम मान संग्रहीत होता है, तो यह ग्राहक के स्थानीय समय में होता है। मुझे उस तारीख को किसी भी अन्य ग्राहक पर कहीं भी प्राप्त करने में सक्षम होना चाहिए, जो भी समय क्षेत्र में हो सकता है, जो कि अन्य क्लाइंट हो सकता है।मैं टाइम ज़ोन समस्याओं को अनदेखा कर SQL सर्वर से डेटटाइम डेटा कैसे प्राप्त कर सकता हूं?

तो उदाहरण के लिए, जब न्यूयॉर्क में कोई उपयोगकर्ता डेटटाइम मान " 2012-12-20 00:00 ", मैं चाहता हूं कि कैलिफ़ोर्निया में उपयोगकर्ता उसी डेटटाइम मान को देख सके। इन डेटटाइम मानों को समय क्षेत्र में अंतर का सम्मान नहीं करना चाहिए, लेकिन यही वह है जो मैं देख रहा हूं। वर्तमान में, SQL सर्वर उस दिनांक समय को कैलिफ़ोर्निया उपयोगकर्ता को "2012-12-19 21:00" के रूप में वितरित करेगा। ध्यान दें कि ईएसटी से पीएसटी में परिवर्तन के कारण -3 घंटे रोलबैक के कारण यह पिछले दिन कैसा है (इस वार्तालाप के प्रयोजनों के लिए डीएसटी मुद्दों को भूल जाओ)।

उस डेटा को वापस शब्दशः प्राप्त करना, और समय क्षेत्र द्वारा अनुवादित नहीं किया गया है, जो मुझे पूरा करने की आवश्यकता है। तो आप क्या सलाह दे सकते हैं?

कुछ कोड पर विचार करना:

यहाँ टेबल है:

CREATE TABLE [dbo].[tblMeterReadings](
[fldMeterReadingsID] [int] IDENTITY(1,1) NOT NULL, 
[fldMeterID] [int] NOT NULL, 
[fldUser] [varchar](50) NULL, 
[fldBy] [varchar](50) NULL, 
[fldDateOfReading] [datetime] NULL, 
[fldReading] [float] NULL, 
[fldIsArchived] [bit] NULL DEFAULT ((0)), 

हम एक Sql वर्ग कि काम करता है, और निम्न उदाहरण में "एसक्यूएल" उस की एक वस्तु है कक्षा। कॉल एक पैरामिट्रीकृत क्वेरी जहां @ data0 दिनांक समय वस्तु किसी SQL दिनांक समय क्षेत्र में स्टोर करने के लिए है का उपयोग किया जाता है:

sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date); 

अंत में, यह ऊपर एक SqlCommand सेट, पैरामीटर देता है, और एक command.ExecuteNonQuery() कॉल आग ।

अब, तारीख को पुनः प्राप्त करने, मैं बस यह एक DataTable में चयन (फिर से, हमारे Sql वर्ग सहायक का उपयोग कर):

DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings"); 

तो क्या मुझे लगता है कि डेटाबेस अपने आप में, तारीख है " 2012-12-20 00:00 "जैसा कि मैं उम्मीद करता हूं, लेकिन जब मैं डीबग में myTable सामग्री का निरीक्षण करता हूं, तो मुझे लगता है कि उस तालिका में दिनांक" 2012-12-19 21:00 "है।

डेटाबेस एक SQL सर्वर पर बनाया गया था जो एक ईएसटी स्थिति में मशीन पर चलता है। मेरी मशीन, हालांकि, पीएसटी पर सेट है। इसलिए चयन में दिनांक दिनांक मूल्य मुझे कैसे दिया जाता है में अंतर।

मुझे क्या याद आ रही है?

+0

संबंधित: http://stackoverflow.com/q/2532729/1583 – Oded

+0

आप डेटाबेस को दिनांक कैसे लिख रहे हैं? डेटाबेस में सहेजने से पहले टाइमटाइम से टाइमज़ोन जानकारी को आसानी से अलग करके आपकी समस्या हल होनी चाहिए। –

+0

@ डैनियल हिल्गार्थ - और यदि इसका मतलब है कि आप इसे यूटीसी के रूप में स्टोर करते हैं, तो मैं सहमत होगा। लेकिन वहां पहले से ही बहुत अधिक डेटा है, और जब तक हम बड़े पैमाने पर रूपांतरण प्राप्त नहीं कर लेते हैं, तब तक मुझे मालिश करने की कोशिश कर रहा हूं क्योंकि मेरे पास यह है। – DonBoitnott

उत्तर

2

आपके अच्छे लोगों के इनपुट के लिए धन्यवाद, और आपके सुझावों के आधार पर कुछ शोध, हमने अपनी समस्या का समाधान किया है।

सहायता के लिए ebyrob के लिए एक विशेष धन्यवाद और इस लिंक: http://support.microsoft.com/kb/842545

वह लिंक अंततः चांदी की गोली साबित हुई।

मौलिक मुद्दा यह है कि जब आप डेटाटेबल या डेटासेट बनाते हैं, तो उस समय क्षेत्र के बारे में जानकारी जिसमें इसे बनाया गया है, उसके साथ एन्कोड किया गया है। फिर, यदि आप उस ऑब्जेक्ट को एक मशीन के कनेक्शन में पास करते हैं जो एक अलग समय क्षेत्र में मौजूद है, तो समय क्षेत्र में अंतर के आधार पर किसी भी डेटटाइम मान समायोजित किए जाएंगे।

उस समझ के प्रकाश में, फिक्स DateTimeMode सभी दिनांक समय डेटा कॉलम की संपत्ति DataSetDateTime.Unspecified पर सेट करना है। यह पोस्ट-सीरियलाइजेशन दिनांक समायोजन को रोकता है, बजाय डेटटाइम मानों को क्रियान्वित करता है।

मैं यह भी इंगित करना चाहता हूं कि आलेख डेटासेट निर्दिष्ट करता है, लेकिन हमने सिद्ध किया है डेटाटेबल भी कमजोर है। असल में, मुझे पूरा यकीन है कि यह डेटाकॉलम के लिए आता है (वे डेटटाइम के प्रकार के साथ, वैसे भी)। मुझे लगता है कि लेख यह भी बताता है।

तो फिर से धन्यवाद; मुझे लगता है कि अब हमें मिल गया है!

+0

जांच परिणामों को पोस्ट करने के लिए धन्यवाद। –

2

डेटाबेस में यूटीसी तिथि स्टोर करें। क्लाइंट में इसे प्रदर्शित करते समय इसे केवल स्थानीय समय में परिवर्तित करें।

सर्वर पक्ष, getdate() के बजाय getutcdate() का उपयोग करें।

DateTime dtDateOfReading = TimeZoneInfo.ConvertTime(
    Convert.ToDateTime(myTables.Rows[i]["fldDateOfReading"]), 
    dtTimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 
    ); 

आप एक से अधिक समय क्षेत्र है, तो आप में है, तो आप समय संग्रहीत करना होगा ताकि चीजों को देखना चाहते:

+1

मैं बिल्कुल सहमत हूं। दुर्भाग्यवश, निकट अवधि में यह संभव नहीं है। वास्तव में, कुछ ग्राहकों के पास पहले से 20+ साल का डेटा है। यह वास्तव में इस तथ्य से आता है कि हम हमेशा एक्सेस डेटाबेस में "इससे दूर हो जाते हैं" और SQL सर्वर के हालिया कदम ने इस कमजोरी को उजागर किया है। – DonBoitnott

1

कहीं भी आप आप कर सकते हैं एक निश्चित समय क्षेत्र में दिनांक को देखना चाहते क्षेत्र या तो तिथि या किस ग्राहक साइट के साथ जाता है।

नोट: परिवर्तित दिनांक समय मानों से सावधान रहें क्योंकि उनके पास एक प्रकार का अनिर्दिष्ट होगा जिसे कुछ मामलों में स्थानीय माना जा सकता है (गलत तरीके से)।

संपादित करें: SQL सर्वर के टाइमज़ोन से मेल खाने के लिए बस SQL ​​कनेक्शन के लिए टाइमज़ोन सेट करना आसान हो सकता है, लेकिन यह आलेख: http://support.microsoft.com/kb/842545 इंगित करता है कि टाइमज़ोन कॉन्फ़िगरेशन कम से कम SqlDataAdapter द्वारा समर्थित नहीं हो सकता है।

+0

मैंने इसे माना। लेकिन क्या यह दृष्टिकोण यह नहीं मानता कि मुझे किस समय क्षेत्र के बारे में कुछ पता है कि डेटटाइम मान के लिए बनाया गया था? मेरा उदाहरण यह सुझाव दे सकता है, लेकिन यह सच नहीं है। मेरे पास बस डेटटाइम है, लेकिन किसी को यह मानना ​​चाहिए कि मुझे इसके बारे में कुछ नहीं पता है। वास्तव में, मुझे भी परवाह नहीं है। यदि यह डेटाबेस में "2012-12-20 00:00" है, तो मैं इसे कैसे चाहता हूं, जैसे कि समय क्षेत्र बिल्कुल मौजूद नहीं था। – DonBoitnott

+0

आप जानते हैं कि SQL सर्वर का समय-क्षेत्र ईएसटी है। आप यह भी जान सकते हैं कि उदाहरण के लिए सभी ग्राहक एनवाईएसईजी के समय ईएसटी में हैं। (मुझे लगता है कि आप वास्तव में सर्वर टाइमज़ोन में एक अंतर को देख रहे हैं, व्यक्तिगत रिकॉर्ड टाइमज़ोन नहीं ...) –

+0

मैंने आपके संपादन में बताए अनुसार, "SQL कनेक्शन के लिए टाइमज़ोन सेट करने" के लिए थोड़ा सा देखा, लेकिन मुझे नहीं पता कि कैसे। क्या आप मुझे किसी पृष्ठ पर इंगित कर सकते हैं, या कोड की नमूना रेखा प्रदान कर सकते हैं? बीटीडब्ल्यू: वह केबी आलेख एक अच्छा पढ़ा है, और मुझे लगता है, ठीक उसी अंतर्निहित समस्या का सामना कर रहा हूं। – DonBoitnott

संबंधित मुद्दे

 संबंधित मुद्दे