2009-04-05 12 views
26

विशेष रूप से बोलने के लिए मुझे केवल घंटों की आवश्यकता है: मिनट लेकिन कहें कि मेरे पास .NET टाइमस्पेन ऑब्जेक्ट है, मुझे इसे SQL (CE) डेटाबेस में कैसे स्टोर करना चाहिए?SQL सर्वर सीई में एक टाइमपैन का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?

उत्तर

38

मैं ticks की संख्या का प्रतिनिधित्व करने के लिए लंबे समय तक उपयोग करने की अनुशंसा करता हूं। TimeSpan इसका आंतरिक प्रतिनिधित्व के रूप में उपयोग करता है। यह आपको Timespan.FromTicks() विधि के साथ आसानी से अपने ऑब्जेक्ट का पुनर्निर्माण करने देता है, और Timespan.Ticks property का उपयोग कर डेटाबेस में आउटपुट देता है। .NET में समय की सबसे छोटी इकाई टिक है, जो 100 नैनोसेकंड

+2

है यही कारण है कि मैं इस परियोजना मैं पर काम कर रहा हूँ पर वास्तव में क्या कर रहा हूँ। ओआरएम लेयर तब रूपांतरण करता है जैसे आपने टाइमस्पेन और टिक्स के बीच, त्रुटि के लिए कोई कमरा नहीं दिया है। इसके अलावा, एक साइड बोनस यह है कि आपको वह सटीकता मिल गई है जिसकी आपको शायद आवश्यकता होगी। यदि आप मिनटों के साथ रहते हैं, तो आपको एक वास्तविक समस्या मिली है यदि आप विपणन विभाग कहते हैं, "परिशुद्धता को सेकंड तक कितना मुश्किल होगा?" –

+0

अच्छा, यद्यपि एक टिक वास्तव में 100 नैनोसेकंड लेने की गारंटी है? – SepehrM

+0

ढांचे के दस्तावेज में किसी भी विग्लू रूम का उल्लेख नहीं है: https://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx –

1

एसक्यूएल सीई में समय का प्रकार नहीं है, या उपयोगकर्ता परिभाषित प्रकार नहीं हैं, इसलिए आपके विकल्प डेटाटाइम हैं या एक मिनट मिनट का प्रतिनिधित्व करते हैं। यदि आपको स्टोर करने की सबसे बड़ी समय 23:59 = 23 * 60 + 59 = 1439 = मिनट 0 से शुरू होने वाले दिन में मिनटों की संख्या है, तो एक छोटा सा छोटा अभिन्न प्रकार है जो उस सीमा को समायोजित करेगा।

छोटे कॉलम के रूप में अलग कॉलम में घंटे और मिनट स्टोर करने के लिए प्रलोभन का विरोध करें। वह एक ही स्थान के रूप में एक ही स्थान के रूप में उपयोग करेगा, लेकिन फिर समय की हर गणना के लिए 60 से गुणा करने और मिनट जोड़ने की आवश्यकता होगी, और प्रत्येक order by को एक के बजाय दो कॉलम की आवश्यकता होगी।

मिनट के रूप में स्टोर करें; प्रदर्शन पर, आप

select floor(absminutes/60) as hours, absminutes % 60 as minutes, 
from some table 
order by absminutes; 

साथ घंटे में मिनट और मिनट अलग कर सकते हैं मैं स्तंभ (रों) minutes, या absminutes (निरपेक्ष मिनट के लिए) नाम हैं तो आप से एक दिन में 1439 मिनट भेद करने के लिए चाहते हैं एक घंटे में 0-59 मिनट।

एक समयावधि वस्तु के लिए डेटाबेस मूल्य से बदलने के लिए, new Timespan(absminutes * TimeSpan.TicksPerMinute) के साथ इस new TimeSpan(floor(absminutes/60), absminutes % 60, 0) तरह ctor Timespan(int, int, int) या (बेहतर) ctor Timespan(long) का उपयोग करें।

टाइम्सpan ऑब्जेक्ट से डेटाबेस डालने या अपडेट करने के लिए, someTimespan.TotalMinutes % 1440 पर अनुपस्थित सेट करें।

1

एक वर्कर के रूप में स्टोर के बराबर है। TimeSpan.ToString() का उपयोग कर एसक्यूएल में सहेजें। एसक्यूएल रूप से पढ़ें:

TimeSpanObj = TimeSpan.Parse(fieldValue) 
+3

यह डाउनवॉट क्यों किया गया था? यह एक वैध सुझाव है, और यदि आपको सीधे SQL डेटा संपादित करना है, तो '1200000000' के बजाय" 2 मिनट "लिखना बहुत आसान है। –

0

मैं इस समय इस संभाल करने के लिए एसक्यूएल समय का उपयोग कर पर विचार कर रहा हूँ, लेकिन यह> = 24 घंटे के लिए काम नहीं करेगा।

लाभों में एसक्यूएल और कोड दोनों में आसानी से उपयोग करने योग्य, आसानी से उपयोग करने योग्य शामिल हैं, लेकिन गिरावट यह है कि आपके पास खेलने के लिए केवल एक छोटा सा समय है।

declare @delay table (DelayTime Time(3)) 
insert into @delay values ('00:10:00.000') 
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay 

और

SqlDataReader dr = cmd.ExecuteReader(); 
DelayTime = (TimeSpan) dr["DelayTime"]; 
संबंधित मुद्दे

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