比较相等的日期时间而不是比较

时间:2013-04-17 08:44:01

标签: c# datetime telerik-open-access

我查询了如何在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作为数据库层,所以我假设问题出现在那里。任何人都可以告诉我,如果我有什么遗漏,以及如何正确比较这些值。

编辑:刻度值不同但我不知道为什么因为它们都来自同一个我只分配给它的变量。

3 个答案:

答案 0 :(得分:20)

尝试使用DateTime.Equals(x.CreatedDate, createdDate),它可能会有所帮助。

除此之外,适当的DateTime比较是一个大型复杂的主题,有时区,偏移,utc,当地时间和诸如此类的东西。我完全不会对两个看似相同的日期之间的简单==比较感到惊讶。

如果Ticks值在写入和读取方面有所不同,您可能会面临DateTimeKind问题,您正在向数据库写入DateTimeKind.Local,但要回到DateTimeKind.Unspecified

另一个选项可能是(如果差异足够小)数据库中的DateTime字段不足以存储与.net DateTime相同的毫秒数:

  

单个刻度表示一百纳秒或一百万分之一秒。一毫秒内有10,000个刻度。

根据您的数据存储,它可能不如此详细。您的DateTime值不是来自同一个源,一个是从内存中读取的,另一个是从数据库中读取的。

答案 1 :(得分:3)

SqlServer以(约)3毫秒的增量存储datetime

  

日期时间值四舍五入为.000,.003或.007秒的增量

因此,通过数据库的DateTime往返可以关闭几毫秒。

所以你不应该测试“完全相等”,而是“足够接近”

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

答案 2 :(得分:0)

我认为在存储数据时使用DateTime.UtcNow可能会更好,然后您不必担心夏令时问题等。然后您可以显示它以后如何使用文化挑

相关问题