存储过程<=与>=逻辑异常求助:员工离职数据过滤错误
问题排查与修复方案
我来帮你搞定这个问题,核心问题出在两个地方:硬编码的固定年月值和反向的过滤逻辑,导致你选2018年5月时,离职于2018年3月的员工还会显示出来。
问题拆解
- 硬编码参数,无法动态过滤:你当前的存储过程里写死了
MONTH(a.resigned_date) <= 4 and year(a.resigned_date) <= 2017,这意味着不管前端选什么年月,只有2017年4月及之前离职的员工才会被过滤,完全没用到用户选择的年月值。 - 逻辑方向错误:你的WHERE条件是允许离职年月≤2017/4的离职员工显示,但你实际需要的是隐藏离职年月≤所选年月的离职员工,也就是只有离职年月晚于所选年月的离职员工才应该出现在列表里。
修复后的存储过程
首先需要给存储过程添加两个动态参数,接收前端选择的年份和月份,然后调整过滤逻辑:
CREATE PROCEDURE GetFilteredEmployees -- 替换成你的存储过程原名 @selectedYear INT, @selectedMonth INT AS BEGIN SELECT empID, badgenum, first_name, ISNULL(c.groupShortName,'') groupName, ISNULL(b.statDesc, '') statDesc, ISNULL(email,'') email, ISNULL(contact_no,'') contact_no, a.resigned_date FROM userinfo a LEFT JOIN tblEmpStatus b on a.employment_status = b.statID LEFT JOIN tblGroup c on a.groupNo = c.groupID WHERE -- 在职员工全部保留 a.employment_status IN (0,1) -- 离职员工仅保留离职年月晚于所选年月的记录 OR ( a.employment_status = 2 AND a.resigned_date IS NOT NULL -- 避免无离职日期的异常数据 AND ( YEAR(a.resigned_date) > @selectedYear OR (YEAR(a.resigned_date) = @selectedYear AND MONTH(a.resigned_date) > @selectedMonth) ) ) ORDER BY first_name ASC END
使用说明
当前端选择了年份和月份后,调用这个存储过程时传入对应参数即可,比如选择2018年5月时,执行:
EXEC GetFilteredEmployees 2018, 5
这时候离职日期为2018/03/07的Alexis会因为离职年月(2018年3月)≤所选年月(2018年5月)而被过滤掉,不会出现在结果列表里,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user9663005
相关产品推荐
相关产品推荐

