【问题标题】:VB DataView.RowFilter and Cast Before CompareVB DataView.RowFilter 和 Cast Before Compare
【发布时间】:2012-10-18 20:21:30
【问题描述】:

在下面的 DataView.Rowfilter 过滤器中,Request_Date 是一个小的日期时间:

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) &lt;= '12/31/2012'。有什么方法可以为 DataView 字段获取不同的日期格式,或者我是否在比较之前无法按摩结束日期?

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

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

感谢您的帮助!

【问题讨论】:

    标签: vb.net dataview


    【解决方案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()
    

    【讨论】:

    • 我真的很感激,蒂姆,我可能应该指出我们仍在使用 .NET 2.0(不要问)。
    【解决方案2】:

    不要使用“

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2022-09-25
      相关资源
      最近更新 更多