2013-04-17 4 views
8

मैं कैसे datetimes तुलना की जाती है/सी # में संग्रहीत के साथ एक प्रश्न है। निम्नलिखित कोड पर विचार करें:मुकाबले बराबर की तुलना नहीं datetimes

var createdDate = DateTime.Now; 
using (cr = new LanguageDictionaryRepository(ds)) { 
    cr.Add(new Sybrin10.Data.DTO.LanguageDictionary() { 
     Active = true, 
     CreatedDate = createdDate, 
     CultureCode = cultureCode, 
     Data = new System.Text.UTF8Encoding().GetBytes("Test") 
    }); 
    cr.Save(); 

    var y = cr.FindBy(x => x.CultureCode == cultureCode && x.CreatedDate == createdDate).FirstOrDefault(); 
    Assert.IsNotNull(y); 

Assert.IsNotNull डेटाटाइम चेक की वजह से विफल रहा है। मैं उम्मीद करता हूं कि भाषा डिक्शनरी उदाहरण वैरिएबल के मान के साथ बनाया गया है कि दोनों बराबर होंगे। यह एक डीबी परत के रूप में Telerik.OpenAccess और MSSQL का उपयोग कर रहा है, इसलिए मुझे लगता है कि समस्या वहां आती है। क्या कोई मुझे बता सकता है कि इसमें कुछ भी है जो मुझे याद है और इन मूल्यों की सही ढंग से तुलना कैसे करें।

संपादित करें: टिक मान भिन्न हैं लेकिन मैं नहीं जानता कि क्यों के रूप में वे दोनों एक ही चर जो मैं केवल एक बार के लिए असाइन से आते हैं।

+1

क्या आप वाकई दिनांकों समान हैं कर रहे हैं के लिए? तुलना में घंटों/मिनट/सेकेंड/मिली-सेकंड लगेंगे। – Oded

+0

बात है कि, टिक मान भिन्न हैं लेकिन क्यों के रूप में वे दोनों एक ही चर CreatedDate से आते हैं मुझे यकीन है कि नहीं हूँ। – Ash

+0

सिस्टम। डेटटाइम – Ash

उत्तर

15

DateTime.Equals(x.CreatedDate, createdDate) उपयोग करने का प्रयास है, यह मदद कर सकता है।

इसके अलावा, उचित DateTime तुलना समय-समय, ऑफसेट, यूटीसी, स्थानीय समय और व्हाट्नॉट के साथ एक जटिल जटिल विषय है। मैं बिल्कुल भी हैरान नहीं किया जाएगा एक सरल == में दो मालूम होता है समान तिथियों के बीच तुलना झूठी वापस जाने के लिए।

Ticks मूल्य लिखने पर अलग है और पढ़ा है, आप कर रहे हैं एक DateTimeKind समस्या का सामना किया जा सकता है, जहाँ आप डेटाबेस के लिए एक DateTimeKind.Local लिख रहे हैं, लेकिन एक DateTimeKind.Unspecified वापस पाने हैं।

अन्य विकल्प हो सकता है (यदि अंतर काफी छोटा है) कि आपके डेटाबेस में DateTime क्षेत्र के लिए काफी महत्वपूर्ण .net DateTime के रूप में मिलीसेकंड का एक ही राशि के स्टोर करने के लिए नहीं है:

एक एकल टिक एक सौ नैनोसेकंद या एक सेकंड के दस लाखवें हिस्से का प्रतिनिधित्व करता है। मिलीसेकंड में 10,000 टिक हैं।

आपके डेटा संग्रहण के आधार पर, यह इस तरह के रूप में विस्तृत नहीं हो सकता है। आपका DateTime मूल्यों एक ही स्रोत से नहीं आते हैं, एक स्मृति से पढ़ा जाता है, अन्य डेटाबेस से पढ़ा जाता है।

+0

विचार के लिए धन्यवाद लेकिन यह भी काम नहीं करता है। – Ash

+0

उस स्थिति में, तारीखों के स्ट्रिंग प्रस्तुति की तुलना एक वैध विकल्प की तुलना कर रही है? – Ash

+0

यदि आप सिर्फ आपके द्वारा बनाए गए रिकॉर्ड को वापस प्राप्त करना चाहते हैं, तो टेलरिक्स [कैसे करें: ऑब्जेक्ट डालें] देखें (http://www.telerik.com/help/openaccess-orm/developer-guide-crud-add.html)। यह सहेजने के बाद बनाई गई प्राथमिक कुंजी को वापस पढ़ेगा। –

0

मुझे लगता है कि जब आप डेटा स्टोर करते हैं तो डेटटाइम का उपयोग करना बेहतर हो सकता है। तब आप डेलाइट सेविंग टाइम इश्यू आदि के बारे में चिंता करने की ज़रूरत नहीं है। फिर आप इसे प्रदर्शित कर सकते हैं कि आप बाद में संस्कृति का उपयोग कैसे करना चाहते हैं तुम्हें लेने।

+0

यह काम नहीं किया। – Ash

2

एसक्यूएलसेवर datetime (लगभग) 3-मिलीसेकंद वृद्धि में स्टोर करता है।

datetime मान .000, .003, या .007 सेकंड

डेटाबेस के माध्यम से दिनांक समय का एक गोल यात्रा की वेतन वृद्धि के लिए गोल कर रहे हैं इस प्रकार कुछ एमएस द्वारा बंद हो सकता है।

तो आप के लिए परीक्षण नहीं करना चाहिए "बिल्कुल बराबर", लेकिन "पर्याप्त बंद"

var y = cr.FindBy(x => x.CultureCode == cultureCode && 
        x.CreatedDate >= createdDate.AddMilliseconds(-5) && 
        x.CreatedDate <= createdDate.AddMilliseconds(5)) 
    .FirstOrDefault(); 
+0

मुझे यह नहीं पता था, इसे इंगित करने के लिए धन्यवाद, मैं ऊपर उठाना चाहता हूं लेकिन आपका कोड नमूना वास्तविकता में बहुत व्यावहारिक नहीं है। अब यदि आप इसे एक एक्सटेंशन बनाते हैं, तो अब हम –

+0

पर बात कर रहे हैं आप '(x.CreatedDate - madeDate) का उपयोग कर सकते हैं। मिलिसेकंड <4' यदि आप एक छोटी सी नोटेशन की तलाश में हैं। – DdW

+2

@DdW - आपको इसके आसपास 'Math.Abs' जोड़ने की आवश्यकता होगी, क्योंकि आप उस तुलना से नकारात्मक मान प्राप्त कर सकते हैं (जो हमेशा निश्चित रूप से <4) –

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