2013-04-17 43 views
8

我有一個查詢日期時間是如何比較/存儲在C#中。考慮以下代碼:比較相等日期時間不比較

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由於日期時間檢查而失敗。我期望,因爲LanguageDictionary實例是通過變量的值創建的,所以兩者是平等的。這是使用Telerik.OpenAccess和MSSQL作爲數據庫層,所以我假設問題出現在那裏。任何人都可以告訴我是否有任何遺漏,以及如何正確比較這些值。

編輯:刻度值是不同的,但我不知道爲什麼,因爲他們都來自同一個變量,我只分配一次。

+1

確定的日期是相同的?考慮到比較需要幾小時/分鐘/秒/毫秒。 – Oded

+0

就是這樣,tick值是不同的,但我不確定爲什麼它們都來自相同的變量createdDate。 – Ash

+0

System.DateTime – Ash

回答

15

嘗試使用DateTime.Equals(x.CreatedDate, createdDate),這可能有所幫助。

除此之外,正確DateTime比較是一個大量複雜的主題與時區,偏移量,utc,本地時間和whatnot。我不會驚訝於簡單的==比較兩個看似相同的日期,以返回false。

如果Ticks值不同的寫入和讀取,你可能會面臨一個問題DateTimeKind,在那裏你正在寫一個DateTimeKind.Local到數據庫,但回頭看看DateTimeKind.Unspecified

另一種選擇可能是(如果差足夠小),在您的數據庫DateTime場是不夠顯著以毫秒爲單位的相同數量的存儲作爲.NET DateTime

一個滴答中代表百納秒或百萬分之一秒。毫秒中有10,000個刻度。

根據您的數據存儲,它可能不像這樣詳細。您的DateTime值不是來自同一個來源,而是從內存中讀取的,另一個是從數據庫讀取的。

+0

感謝您的想法,但這也沒有奏效。 – Ash

+0

在這種情況下,是比較日期的字符串表示一個有效的選項? – Ash

+0

如果您只想取回您創建的記錄,請參閱Teleriks [如何:插入對象](http://www.telerik.com/help/openaccess-orm/developer-guide-crud-add.html)。它會在保存後讀回創建的主鍵。 –

0

我認爲在您存儲數據時使用DateTime.UtcNow可能會更好,然後您不必擔心夏令時問題等。然後,您可以顯示它以後如何使用文化你選。

+0

這沒有奏效。 – Ash

2

SqlServer以(大約)3毫秒的增量存儲datetime

日期時間值被四捨五入爲0.000,0.003,或0.007秒

通過數據庫一個DateTime的往返增量從而可以通過幾ms關閉。

所以你不應該測試「完全相等」,但「足夠接近」

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

我不知道這一點,謝謝你指出,我會upvote,但你的代碼示例是不現實的。現在,如果您將其設置爲擴展名,那麼現在我們正在討論 –

+0

如果您要查找較短的符號,則可以使用'(x.CreatedDate - createdDate).Milliseconds <4'。 – DdW

+2

@DdW - 您需要在它周圍添加一個'Math.Abs​​',因爲您可以從該比較中獲得負值(當然總是小於4) –