在以下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) & "#"
感谢您的帮助!
答案 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” - 这是最优雅的,并且完全符合您的要求。