代码之家  ›  专栏  ›  技术社区  ›  Tadas Å ukys

带有DateTime和less或equal运算符问题的DataTable筛选器表达式

  •  0
  • Tadas Å ukys  · 技术社区  · 15 年前

    
                DataTable t = new DataTable();
                t.Locale = CultureInfo.InvariantCulture;
                t.Columns.Add("Date", typeof(DateTime));
    
                DateTime today = DateTime.Now;
                DateTime yesterday = today.AddDays(-1);
                DateTime tomorow = today.AddDays(1);
    
                t.Rows.Add(yesterday);
                t.Rows.Add(today);
                t.Rows.Add(tomorow);
    
                string filter = string.Format(CultureInfo.InvariantCulture,
                    "Date >= #{0}# AND Date <= #{1}#", yesterday, tomorow);
    
                t.DefaultView.RowFilter = filter;
    
                foreach (DataRowView v in t.DefaultView)
                    Console.WriteLine(v["date"]);
    
    

    我期待着你的回答 t.DefaultView 现在包含所有三个“天”。但由于某些原因,该范围内的最后日期不包括在内。看来 <= 接线员 DateTime < .

    更新。 得到了一些关于 日期时间 类型和比较运算符。谢谢 filter expression

    
    foreach (DataRow r in t.Rows)
    {
      DateTime date = (DateTime)r["Date"];
      if (yesterday <= date && date <= tomorow)
          Console.WriteLine(date);
    }
    
    

    此循环应显示与以下相同的结果

    
    foreach (DataRowView v in t.DefaultView)
      Console.WriteLine(v["date"]);
    
    

    < 正如我所期待的那样,结果是三天。为什么?

    更新#2:解决方案。 正如乔所指出的,问题是关于几分之一秒。 如果我使用往返日期/时间模式设置上限和下限的格式(以保留几分之一秒),则一切正常:

    
    
    string filter = string.Format(CultureInfo.InvariantCulture,
                    "Date >= '{0}' AND Date <= '{1}'",
                    yesterday.ToString("o", CultureInfo.InvariantCulture),
                    tomorow.ToString("o", CultureInfo.InvariantCulture));
    
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   to StackOverflow    15 年前

    您在更新中发布的代码与行筛选器不同。 行过滤器使用当前区域性的常规格式格式化日期。这可能不包括几分之一秒——因此,除非您碰巧调用DateTime tomorrow

    即如果你的 明天

    如果只想比较日期,则应使用DateTime.Date从日期中截断时间组件(并使用DateTime.Today而不是DateTime.Now作为当前日期)。

        2
  •  2
  •   Thomas Levesque    15 年前

    日期比较将时间考虑在内。例如,“今天中午”比“今天”更重要。如果你使用 DateTime.Now ,时间已包括在内。那么,如果 约会时间,现在 tomorrow = today.AddDays(1) 少于“明天下午3点”。。。因此,您需要忽略日期的时间部分。您可以通过格式化日期而不设置时间来实现这一点。此外,如果要检查某个日期是否“小于或等于明天”(无论何时),请检查该日期是否“严格小于后天”:

    string filter = string.Format(CultureInfo.InvariantCulture,
                    "Date >= #{0:MM/dd/yyyy}# AND Date < #{1:MM/dd/yyyy}#",
                    yesterday,
                    tomorrow.AddDays(1));
    
        3
  •  1
  •   Saar    15 年前

    试一试

    DateTime today = DateTime.Today;
    

    如果未解决,请检查日期字段是否也包含时间。这就是你的问题所在。

    更新:你的第二个评论。

    当您与DateTime进行比较时。现在,例如Date<=21.12.2009 14:35:35,将花费14:35小时之前的所有时间,并将忽略后面的行。希望这对你有帮助。

    请参阅下面的文章以了解更多信息

    http://dotnetguts.blogspot.com/2007/06/understanding-datetime-and-timespan-in.html