You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET如何筛选DataTable中runDays列含指定周几数值的行

解决DataTable检索包含指定周几的行的问题

报错原因

DataTable的Select方法中,IN运算符要求右侧必须是常量值列表,你传入的runDays是列名,会被当作字符串常量处理,而非列中的逗号分隔值,因此抛出EvaluateException异常。

可行方案

方案1:使用Linq to DataSet(推荐)

直接通过Linq遍历DataRow,拆分runDays列的字符串并判断是否包含目标周几,逻辑更直观且类型安全:

Dim nowDay As Integer = CInt(DateTime.Now.DayOfWeek)
Dim nowDate As DateTime = DateTime.Now.Date
Dim nowTime As String = DateTime.Now.ToString("HH:mm")

Dim result = dtbSchedule.AsEnumerable().Where(Function(row)
    Return row.Field(Of String)("runType") = "weekly" AndAlso
           row.Field(Of DateTime)("startDate") <= nowDate AndAlso
           row.Field(Of DateTime)("endDate") >= nowDate AndAlso
           row.Field(Of String)("runTime") = nowTime AndAlso
           row.Field(Of String)("runDays").Split(","c).Contains(nowDay.ToString())
End Function).ToArray()

方案2:使用Like表达式匹配边界

通过给runDays前后添加逗号,构造精确匹配的Like条件,避免部分匹配(比如周几为1时,不会误匹配"10,2"这类字符串):

Dim nowDay As Integer = CInt(DateTime.Now.DayOfWeek)
Dim nowDateStr As String = DateTime.Now.ToString("yyyy-MM-dd") ' 需与DataTable中日期列格式一致
Dim nowTime As String = DateTime.Now.ToString("HH:mm")

Dim filter As String = $"runType = 'weekly' AND startDate <= '#{nowDateStr}#' AND endDate >= '#{nowDateStr}#' AND runTime = '{nowTime}' AND ',' + runDays + ',' LIKE '%,{nowDay},%'"
Dim result() As DataRow = dtbSchedule.Select(filter)

注意事项

  • Linq方案无需关注日期字符串格式,直接通过DateTime类型比较,更可靠。
  • Like方案需确保日期字符串格式与DataTable中startDate、endDate的存储格式完全一致,否则会导致日期比较失效。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:40:32