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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:08