如何在数据表中过滤datetime字段而忽略C#中的时间值

时间:2013-02-01 09:23:01

标签: c# datetime datagridview datatable datetimepicker

我试过这段代码:

(datagridview1.DataSource as DataTable).Select("date_time=" + Convert.ToDateTime(dtpDate.Text.ToString()));

但我认为它仍然包含时间并且让我出错“语法错误:'12'运算符后缺少操作数。”

我真正希望发生的是过滤datable的datetime字段而忽略它的时间,只是过滤日期。

以下是我的datagridview的样子:

1   1   1/24/2013 12:34 AM  
1   2   1/24/2013 12:34 AM  
2   3   1/24/2013 12:53 AM  
3       1/25/2013 12:30 AM  
4       1/25/2013 12:53 AM  
5   4   1/25/2013 2:10 AM   
6   5   1/25/2013 2:26 AM   
7   6   1/25/2013 2:39 AM   
8   7   1/25/2013 2:40 AM   

更新的代码:

datagridview1.DataSource = (datagridview1.DataSource as DataTable).AsEnumerable()
            .Where(r => r.Field<DateTime?>("date_time").HasValue 
                    && r.Field<DateTime?>("date_time").Value.Date == dt.Date).CopyToDataTable();

2 个答案:

答案 0 :(得分:3)

要比较日期时,请勿使用字符串。您可以使用Linq-To-DataTable和强类型DataRow扩展方法Field。然后使用Date的{​​{1}}属性。

DateTime

修改(根据您的评论)

  

“无法将DBNull.Value强制转换为'System.DateTime'。请使用可空类型。

然后您在此字段中有DateTime dt = DateTime.Parse(dtpDate.Text); DataTable filteredRows = table.AsEnumerable() .Where(r => r.Field<DateTime>("date_time").Date == dt.Date) .CopyToDataTable(); 。由于Field方法支持nullable-types,因此您可以直接使用它。

nulls

编辑因此,当表为空时,您会收到异常。是的,当源表为空时,DataTable filteredRows = table.AsEnumerable() .Where(r => r.Field<DateTime?>("date_time").HasValue && r.Field<DateTime?>("date_time").Value.Date == dt.Date) .CopyToDataTable(); 会抛出CopyToDataTable

请注意,您可能根本不需要将结果复制到新的InvalidOperationException中。您可以将查询本身绑定到datagridview的datasource属性,因此请尝试简单地省略DataTable

CopyToDataTable

否则您还可以检查查询是否返回任何内容:

var filteredRows = table.AsEnumerable()
    .Where(r => r.Field<DateTime?>("date_time").HasValue 
            &&  r.Field<DateTime?>("date_time").Value.Date == dt.Date);

datagridview1.DataSource = filteredRows;

答案 1 :(得分:1)

            DataView dv = new DataView(Datatable1);
            dv.RowFilter = "StartDate >= #" + DtpDateRangeFrom.Value + "# AND StartDate <= #" + DtpDateRangeTo.Value + "#";