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

存储过程<=与>=逻辑异常求助:员工离职数据过滤错误

问题排查与修复方案

我来帮你搞定这个问题,核心问题出在两个地方:硬编码的固定年月值和反向的过滤逻辑,导致你选2018年5月时,离职于2018年3月的员工还会显示出来。

问题拆解

  1. 硬编码参数,无法动态过滤:你当前的存储过程里写死了MONTH(a.resigned_date) <= 4 and year(a.resigned_date) <= 2017,这意味着不管前端选什么年月,只有2017年4月及之前离职的员工才会被过滤,完全没用到用户选择的年月值。
  2. 逻辑方向错误:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:25:32