2010-08-27 91 views
11

我正在摸索我的头,而不是愚蠢但显然很难。在DataView.RowFilter中比较日期?

DataView dvFormula = dsFormula.Tables[0].DefaultView; 
dvFormula.RowFilter = "'" + startDate.ToString("yyyyMMdd") + "' < EndDate OR EndDate = '19000101'"; 
dvFormula.Sort = "FromDate ASC"; 

结果是这样的:

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

请告诉我解决这个问题的最好方法是什么。

非常感谢!

回答

20

你需要用#包裹你的日期,而不是撇号。

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

你说得对,它是#。但关键部分是dateformat需要与系统设置使用的相同。这是多么愚蠢...所以现在我使用'startDate.ToShortDateString()'。感谢m8! – Peter 2010-08-27 13:36:14

+0

不知道日期格式匹配系统设置。感谢您教育我和任何阅读此内容的人! – Dan 2010-08-27 15:47:25

+3

@Peter,这里在英国(我们的日期格式有意义 - dd/mm/yyyy)我必须使用“yyyy/MM/dd”或美国布局。如果我做了ToShortDateString,那么它有一个翻转。另外,我推荐使用“yyyy/MM/dd”格式,因为它不是特定于语言环境的格式 - 除非任何人有更好的信息? – noelicus 2012-11-15 16:42:09

3

根据您的数据提供商的不同,您可能需要使用#字符而不是'字符来避开日期。另外,我会以YYYY-MM-DD的格式格式化日期,以确保它能被正确识别为日期。

8

这是解决方案。试试这个:

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