11

我有一个关于如何在 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 作为数据库层,所以我假设问题出在那儿。谁能告诉我我是否缺少任何东西以及如何正确比较这些值。

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

4

3 回答 3

21

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

除此之外,正确的DateTime比较是一个非常复杂的主题,包括时区、偏移量、UTC、当地时间等等。==对于两个看似相同的日期之间的简单比较以返回 false,我一点也不感到惊讶。

如果Ticks写入和读取的值不同,您可能会遇到一个DateTimeKind问题,即您正在将 a 写入DateTimeKind.Local数据库,但返回一个DateTimeKind.Unspecified.

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

一个滴答表示一百纳秒或百万分之一秒。一毫秒内有 10,000 个滴答声。

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

于 2013-04-17T08:54:24.400 回答
3

SqlServer以(大约)3 毫秒为增量存储日期时间。

日期时间值四舍五入为 0.000、0.003 或 0.007 秒的增量

因此,通过数据库的 DateTime 往返可能会延迟几毫秒。

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

var y = cr.FindBy(x => x.CultureCode == cultureCode && 
                    x.CreatedDate >= createdDate.AddMilliseconds(-5) && 
                    x.CreatedDate <= createdDate.AddMilliseconds(5))
     .FirstOrDefault();
于 2013-04-17T09:20:31.850 回答
0

我认为在存储数据时使用 DateTime.UtcNow 可能会更好,这样您就不必担心夏令时问题等。然后您可以稍后使用您选择的文化以您想要的方式显示它。

于 2013-04-17T08:53:46.717 回答