如何在VB.NET的RDLC表达式中使用两个日期数据集计算出勤天数
解决跨数据集计算出勤天数的问题
错误原因分析
你之前使用的表达式=SUM(First(Fields!Idate.Value, "DataSet1"))-SUM(First(Fields!Date.Value, "DataSet2"))存在核心逻辑错误:
First()仅返回数据集的第一条记录值,对单个值调用SUM()没有实际意义- 日期类型字段无法直接进行算术求和运算,这就是DataSet2报错的根本原因
正确解决方案
出勤天数的核心逻辑是「DataSet1总天数 - DataSet2假期天数」,或直接统计DataSet1中不属于假期的日期数量,以下是两种可行的SSRS表达式写法:
方法1:总天数减假期数
适用于DataSet1为3月完整日期范围(无缺失)的场景,写法最简单:
=CountRows("DataSet1") - CountRows("DataSet2")
CountRows("DataSet1"):统计DataSet1的总记录数,即3月总天数(31天)CountRows("DataSet2"):统计DataSet2的假期记录数(4天)- 最终计算结果为31-4=27天
方法2:精确筛选非假期日期
如果DataSet1存在日期缺失,或需要更严谨的匹配验证,可通过LookupSet函数判断日期是否在假期列表中,再统计出勤日:
=Sum(IIF(IsNothing(LookupSet(Fields!Idate.Value, Fields!Date.Value, Fields!Date.Value, "DataSet2")).Length = 0, 1, 0), "DataSet1")
LookupSet():查找当前Idate在DataSet2的Date字段中是否存在,返回匹配结果数组- 数组长度为0说明该日期不在假期列表中,计为1天出勤,最后用
Sum()累加所有符合条件的天数
注意事项
- 确保两个数据集的日期字段数据类型完全一致(均为日期型,而非字符串),否则会出现匹配失败的情况
- 如果需要额外排除周末,可在判断中加入星期筛选,仅统计周一至周五:
=Sum(IIF(IsNothing(LookupSet(Fields!Idate.Value, Fields!Date.Value, Fields!Date.Value, "DataSet2")).Length = 0 And Weekday(Fields!Idate.Value, vbMonday) < 6, 1, 0), "DataSet1")
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

