在DataView.RowFilter中比较日期?

15
我正在为一件看似很蠢但显然很困难的问题烦恼。
DataView dvFormula = dsFormula.Tables[0].DefaultView;
dvFormula.RowFilter = "'" + startDate.ToString("yyyyMMdd") + "' < EndDate OR EndDate = '19000101'";
dvFormula.Sort = "FromDate ASC";

结果如下:

无法在 System.String 和 System.DateTime 上执行'<'操作。

请告诉我解决这个问题的最佳方式。

非常感谢!

3个回答

27

你需要使用#来包裹你的日期,而不是使用单引号。

dvFormula.RowFilter = "#" + startDate.ToString("MM/dd/yyyy") + "# < EndDate OR EndDate = #1/1/1900#"; 

4
你说得对,那是 # 号。但关键在于日期格式必须与你系统设置中的日期格式相同。这真是太愚蠢了...所以现在我使用 startDate.ToShortDateString()。谢谢! - Peter
1
不知道日期格式匹配系统设置。感谢您的教育,以及任何阅读此内容的人! - Dan
6
@Peter,在英国我们使用合理的日期格式dd/mm/yyyy,我必须使用“yyyy/MM/dd”或美式布局。如果我使用ToShortDateString,它就会出现错误。此外,我推荐使用“yyyy/MM/dd”格式,因为它不是与特定地区相关的格式——除非有更好的信息? - noelicus
1
在 T-SQL 中,我习惯于使用“yyyyMMdd”格式,但使用 RowFilter 时,“yyyy/MM/dd”的格式似乎更好。谢谢,非常有帮助。 - Peter

12

这是解决方案。尝试以下内容:

filter = " (Date >= #" +
         Convert.ToDateTime(txtFromDate.Text).ToString("MM/dd/yyyy") +
         "# And Date <= #" +
         Convert.ToDateTime(txtToDate.Text).ToString("MM/dd/yyyy") +
         "# ) ";

5

根据您的数据提供者不同,您可能需要使用 # 字符而不是 ' 字符来转义日期。此外,建议将日期格式化为 YYYY-MM-DD 格式,以确保其能够被正确识别为日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接