【发布时间】: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# 做到这一点。
【问题讨论】:
我有一个数据表,其中记录有日期字段列,其值如下
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# 做到这一点。
【问题讨论】:
如果列的类型已经是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();
【讨论】:
获取每月的第一天并按该日期过滤:
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 所追求的。
firstDayOfMonth 将是上个月的最后一天(例如,在第一天,today.Day 将是 1 所以你将添加 -1 天)