【问题标题】:Get rows filtered by month from a date column从日期列中获取按月份过滤的行
【发布时间】:2013-01-23 10:37:04
【问题描述】:

我有一个数据表,其中记录有日期字段列,其值如下

11/1/2012
12/21/2012
12/22/2012
1/3/2013
1/5/2013
1/6/2013
1/7/2013
etc. 

我想过滤记录并仅获取当前月份记录,即仅获取日期等于当前月份的那些行(将由 DateTime.now 找到)。我们如何使用 Linq 和 c# 做到这一点。

【问题讨论】:

    标签: c# linq date


    【解决方案1】:

    如果列的类型已经是DateTime

    DateTime now = DateTime.Now;
    var thisMonthRows = table.AsEnumerable()
        .Where(r =>  r.Field<DateTime>("ColumnName").Year  == now.Year
                  && r.Field<DateTime>("ColumnName").Month == now.Month);
    

    如果您想从过滤后的行中获得新的 DataTable,请使用 CopyToDataTable

    DataTable table = thisMonthRows.CopyToDataTable();
    

    【讨论】:

    • 如何将 thisMonthRows 放入数据表中?
    • @user1254053:编辑了我的答案。
    【解决方案2】:

    获取每月的第一天并按该日期过滤:

     DateTime today = DateTime.Now.Date;
     DateTime firstDayOfMonth = today.AddDays(1 - today.Day);
     // or new DateTime(today.Year, today.Month, 1);
    
     var query = from row in dt.AsEnumerable()
                 where row.Field<DateTime>("Date") >= firstDayOfMonth
                 select row;
    

    当然,如果您没有包含未来日期的记录(例如下个月),这是可行的。如果你这样做,那么最好引入新的范围变量以避免两次解析日期:

     var query = from row in dt.AsEnumerable()
                 let date = row.Field<DateTime>("Date")
                 where date.Year == today.Year && 
                       date.Month == today.Month
                 select row;
    

    【讨论】:

    • 您的firstDayOfMonth 中有一个错误,我不确定这是否是 OP 所追求的。
    • 投反对票的原因是?因为只有一个日期解析和明确的过滤意图?
    • @Rawling 英语中的off-by-one是什么意思?
    • 我的意思是 firstDayOfMonth 将是上个月的最后一天(例如,在第一天,today.Day 将是 1 所以你将添加 -1 天)
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多