VB DataView.RowFilter和Cast之前比较

时间:2012-10-18 20:21:31

标签: vb.net dataview

在以下DataView.Rowfilter过滤器中,Request_Date是smalldatetime:

dv.RowFilter = "Request_Date >= '01/01/2012' and Request_Date <= '12/31/2012'"

这个问题是smalldatetime是MM/dd/yyyy hh:mm:ss,但它与格式为'MM/dd/yyyy'的字符串进行比较。这意味着过滤器会自动将字符串转换为smalldatetime,因此比较仅显示2012年1月1日12 AM和12/31/2012 12 AM之间的日期/时间。 2012年12月31日当天晚些时候的任何行都将无法通过此过滤器获取。我知道我可以在结束日期添加一天或连接,比如12:59:59到日期结束,以便在当天接收其他时间,但我希望更优雅的东西,沿着这条线等效的SQL ... CONVERT(smalldatetime, Request_Date, 101) <= '12/31/2012'。有没有什么办法可以为DataView字段获取不同的日期格式,还是我在比较之前按下了结束日期?

仅供参考,目前最好的选择是:

dv.RowFilter = "Request_Date >= #" & dtpStartDate.DateText & "# and Request_Date <= #" & DateAdd(DateInterval.Day, 1, dtpEndDate.DateValue) & "#"

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果您使用的是至少.NET 3.5,则可以使用更具可读性的Linq-To-DataSet

DataTable filtered = dv.Table
          .AsEnumerable()
          .Where(r => r.Field<DateTime>("Request_Date") >= dtpStartDate.Value
                   && r.Field<DateTime>("Request_Date") < dtpEndDate.Value.AddDays(1))
          .CopyToDataTable();

添加using.System.Linq;和对System.Data.DataSetExtensions.dll的引用。

编辑:我刚刚看到VB.NET被标记:

Dim filtered = From row In dv.Table
           Where row.Field(Of DateTime)("Request_Date") >= dtpStartDate.Value AndAlso _
                 row.Field(Of DateTime)("Request_Date") < dtpEndDate.Value.AddDays(1)
Dim tblFiltered = filtered.CopyToDataTable()

答案 1 :(得分:0)

不要使用“&lt; = 12/31/2012”,只需使用“&lt; 1/1/2013”​​ - 这是最优雅的,并且完全符合您的要求。