如何基于DateTime列的月份筛选统计DataTable行数?已试Compute和LINQ未果
解决DataTable按月份统计行数的问题
嘿,我太懂这种“明明应该很简单却突然卡壳”的感觉了!咱们来一步步把这个问题拆解搞定。
先搞定你用的Compute方法为啥失败
DataTable的Compute方法用的是它专属的表达式语言,不是SQL语法,所以你写的month(Date)是不被识别的函数。要获取月份得用它支持的DatePart函数,另外日期列名最好用[]包裹(避免列名带特殊字符时出错)。
修正后的代码应该是这样:
int targetMonth = startDate.Value.Month; sickLCount = Convert.ToInt32(LeaveDays.Compute( "COUNT(EmployeeID)", $"LeaveType = 0 AND DatePart('m', [Date]) = {targetMonth}" ));
这里DatePart('m', [Date])就是专门用来提取Date列月份数值的写法,和你要的startDate.Month对比就能精准筛选了。
再补一个靠谱的LINQ写法
你说试了LINQ没成功,大概率是没处理好DataTable的枚举转换。试试这个类型安全的写法:
int targetMonth = startDate.Value.Month; // 别忘了加上年份判断,避免统计到其他年份的同月! int targetYear = startDate.Value.Year; sickLCount = LeaveDays.AsEnumerable() .Where(row => row.Field<int>("LeaveType") == 0 && !row.IsNull("Date") // 避免空日期导致报错 && row.Field<DateTime>("Date").Month == targetMonth && row.Field<DateTime>("Date").Year == targetYear) .Count();
这个方法更灵活,后续要加其他筛选条件直接在Where里扩展就行,而且能提前规避空值报错的问题。
小提醒
如果业务要求只统计当年当月的数据,一定记得加上年份判断!不管是用Compute还是LINQ,只匹配月份的话会把其他年份的同月数据也统计进来,结果就不准了。
内容的提问来源于stack exchange,提问作者Naser Javed
相关产品推荐
相关产品推荐

