1

在以下 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 点和 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) & "#"

谢谢你的帮助!

4

2 回答 2

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()
于 2012-10-18T20:35:10.157 回答
0

不要使用“<= 12/31/2012”,而只需使用“< 1/1/2013”​​——这是最优雅的,并且可以得到你想要的。

于 2013-01-03T12:39:20.917 回答