2012-10-18 50 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日」 - 這是最優雅的,並得到你想要的。