计算延迟退休日期函数(根据L序列O序列计算)

 传入性别、职级、生日,计算出延迟退休的日期。

CREATE OR REPLACE FUNCTION c_caqc_hr_pub_db.biphr_calculate_retirement_date(
    p_gender INT,                   -- 性别: 1-男 2-女
    p_professional_level VARCHAR,   -- 聘任专业职级(L或O开头)
    p_birthday DATE                 -- 出生日期
) 
RETURNS DATE AS $$
DECLARE
    v_category VARCHAR(20);
    v_retirement_date DATE;
BEGIN
    -- 如果任一参数为NULL,直接返回NULL
    IF p_gender IS NULL OR p_professional_level IS NULL OR p_birthday IS NULL THEN
        RETURN NULL;
    END IF;
    
    -- 检查性别必须是1或2
    IF p_gender NOT IN (1, 2) THEN
        RETURN NULL;
    END IF;
    
    -- 检查女性职级必须以L或O开头
    IF p_gender = 2 AND p_professional_level NOT LIKE 'L%' AND p_professional_level NOT LIKE 'O%' THEN
        RETURN NULL;
    END IF;
    
    -- 检查生日是否是有效日期(PostgreSQL的DATE类型已经保证有效性,这里主要防止异常)
    BEGIN
        -- 尝试使用日期,如果出错则返回NULL
        PERFORM p_birthday::text::date;
    EXCEPTION WHEN OTHERS THEN
        RETURN NULL;
    END;

    -- 根据性别和专业职级确定员工类型
    IF p_gender = 1 THEN
        v_category := '男职工';
    ELSE -- p_gender = 2
        IF p_professional_level LIKE 'L%' THEN
            v_category := '女干部';
        ELSE -- LIKE 'O%' (前面已经确保以L或O开头)
            v_category := '女员工';
        END IF;
    END IF;

    -- 计算退休日期
    SELECT 
        CASE v_category
            WHEN '男职工' THEN p_birthday + INTERVAL '60 year' 
            WHEN '女干部' THEN p_birthday + INTERVAL '55 year'
            WHEN '女员工' THEN p_birthday + INTERVAL '50 year'
        END + 
        CASE v_category
            WHEN '男职工' THEN make_interval(0, LEAST(36, 1+(EXTRACT(year FROM age(p_birthday,'1965-01-01'::date))*12 + EXTRACT(month FROM age(p_birthday,'1965-01-01'::date)))::int/4))
            WHEN '女干部' THEN make_interval(0, LEAST(36, 1+(EXTRACT(year FROM age(p_birthday,'1970-01-01'::date))*12 + EXTRACT(month FROM age(p_birthday,'1970-01-01'::date)))::int/4))
            WHEN '女员工' THEN make_interval(0, LEAST(50, 1+(EXTRACT(year FROM age(p_birthday,'1975-01-01'::date))*12 + EXTRACT(month FROM age(p_birthday,'1975-01-01'::date)))::int/2))
        END
    INTO v_retirement_date;

    RETURN v_retirement_date;
END;
$$ LANGUAGE plpgsql;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值