C# 带有DateTime和less或equal运算符问题的DataTable筛选器表达式
我有以下代码:C# 带有DateTime和less或equal运算符问题的DataTable筛选器表达式,c#,ado.net,C#,Ado.net,我有以下代码: DataTable t = new DataTable(); t.Locale = CultureInfo.InvariantCulture; t.Columns.Add("Date", typeof(DateTime)); DateTime today = DateTime.Now; DateTime yesterday = today.AddDays(-
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"]);
此循环应显示与以下相同的结果
foreach (DataRowView v in t.DefaultView)
Console.WriteLine(v["date"]);
从上一个例子来看,是吗?不此处尝试使用
DateTime today = DateTime.Today;
如果未解决,请检查日期字段是否也包含时间。这就是你的问题所在
更新:你的第二个评论
当您与DateTime进行比较时。现在,例如Date尝试使用
DateTime today = DateTime.Today;
如果未解决,请检查日期字段是否也包含时间。这就是你的问题所在
更新:你的第二个评论
当您与日期时间进行比较时。现在,例如日期日期比较会考虑时间。例如,“今天中午”比“今天”更重要。如果使用DateTime.Now
,则包含时间。因此,如果DateTime.Now
是“今天中午”,那么明天=今天。AddDays(1)
小于“明天下午3点”。。。因此,您需要忽略日期的时间部分。您可以通过格式化日期而不设置时间来实现这一点。此外,如果要检查某个日期是否“小于或等于明天”(无论何时),请检查该日期是否“严格小于后天”:
string filter=string.Format(CultureInfo.InvariantCulture,
“日期>={0:MM/dd/yyyy}和日期<{1:MM/dd/yyyy}”,
昨天
明天。添加天(1));
日期比较将时间考虑在内。例如,“今天中午”比“今天”更重要。如果使用DateTime.Now
,则包含时间。因此,如果DateTime.Now
是“今天中午”,那么明天=今天。AddDays(1)
小于“明天下午3点”。。。因此,您需要忽略日期的时间部分。您可以通过格式化日期而不设置时间来实现这一点。此外,如果要检查某个日期是否“小于或等于明天”(无论何时),请检查该日期是否“严格小于后天”:
string filter=string.Format(CultureInfo.InvariantCulture,
“日期>={0:MM/dd/yyyy}和日期<{1:MM/dd/yyyy}”,
昨天
明天。添加天(1));
您在更新中发布的代码不等同于行筛选器。
行过滤器使用当前区域性的常规格式格式化日期。这可能不包括秒的分数-因此,除非您碰巧调用DateTime。现在在第二个边界上,您的明天
值将超出筛选器指定的范围几秒的分数
也就是说,如果明天的值为'2009-12-23 01:02:03.456',则行筛选器只接受小于等于'2009-12-23 01:02:03'的值,比明天指定的值早几秒
如果您只想比较日期,则应使用DateTime.Date从日期中截断时间组件(并使用DateTime.Today而不是DateTime.Now作为当前日期)。您在更新中发布的代码与行筛选器不同。
行过滤器使用当前区域性的常规格式格式化日期。这可能不包括秒的分数-因此,除非您碰巧调用DateTime。现在在第二个边界上,您的明天
值将超出筛选器指定的范围几秒的分数
也就是说,如果明天的值为'2009-12-23 01:02:03.456',则行筛选器只接受小于等于'2009-12-23 01:02:03'的值,比明天指定的值早几秒
如果您只想比较日期,则应使用DateTime.Date从日期中截断时间组件(并使用DateTime.Today而不是DateTime.Now作为当前日期)。在未设置时间时可以正常工作(例如使用DateTime.Today)。但这还不够。你的建议——这不是解决办法。这在未设置时间时有效。但是为什么它不与时间一起工作呢?为什么运算符>=在未设置时间时工作正常(例如使用DateTime.Today)。但这还不够。你的建议——这不是解决办法。这在未设置时间时有效。但是为什么它不与时间一起工作呢?为什么运算符>=工作和
DateTime today = DateTime.Today;
string filter = string.Format(CultureInfo.InvariantCulture,
"Date >= #{0:MM/dd/yyyy}# AND Date < #{1:MM/dd/yyyy}#",
yesterday,
tomorrow.AddDays(1));