2012-10-18 53 views
1

在下面DataView.Rowfilter过滤器,REQUEST_DATE是SMALLDATETIME:VB DataView.RowFilter和铸造之前比较

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点和2012年12月31日上午12点之间的日期/时间。 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) & "#" 

感谢您的帮助!

回答

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() 
+0

我真的很感谢Tim和我可能应该指定我们仍然在.NET 2.0上(不要问)。 – DotNetVet

0

而不是使用 “< = 2012年12月31日”,只需用 “< 2013年1月1日” - 这是最优雅的,并得到你想要的。